没有数据库的剃刀页面中的简单身份验证

有时,使用完整的ASP.NET核心标识框架对于需要某种形式的身份验证的小型,一用户应用程序是矫枉过正的。我正在考虑博客应用程序或基于Web的实用程序,这些实用程序只有允许您允许到达的管理领域。您真正想做的就是针对存储在配置文件中的用户名和密码或类似的密码进行身份验证。您真的不需要数据库,EF核心,ApplicationDBContexts,SignManagers,UserManager等仪式。本文提供了一个步骤指南,即可使用cookie实现简单的身份验证,同时安全地在没有数据库的情况下存储凭据。

概述任务

该过程涉及许多步骤:

  • 配置并启用基于Cookie的身份验证
  • 配置受保护的资源
  • 保护您的凭据
  • 存储凭证
  • 创建登录表单

配置基于Cookie的身份验证

下一步是在请求管道中启用正确的中间件

  1. 创建名为的新剃刀页面应用程序 身份验证 (dotnet new webapp from the command line). 如果您使用的是Visual Studio创建应用程序,请确保 身份验证在“无身份验证”处留下。
    没有身份验证
  2. 将新文件夹添加到 页面 目录,命名 行政.
  3. 添加新的剃刀页 行政 文件夹命名 指数。如果您正在使用 VS Code, you can do this by executing dotnet new page -o Pages/Admin -n Index -na AuthenticationSample.Pages.Admin from the terminal.
  4. 更改代码 index.chtml. to read as follows:
  5. 运行应用程序并导航到 //localhost:xxxx/Admin (where xxxx represents the port number the application is running on). 您应该能够在没有任何问题的情况下到达您刚刚创建的页面。
  6. startup.cs., add using Microsoft.AspNetCore.Authentication.Cookies; to the top of the file.
  7. 改变 ConfigureServices method so that it looks like this:

    在此步骤中,您配置了基于Cookie的身份验证,将登录页面设置为主页。然后你配置了 行政 用于防止未经授权的用户能够访问它的任何内容的文件夹。

  8. Add app.UseAuthentication(); to the Configure method, just app.UseMvc();。此步骤将身份验证中间件添加到管道中,以便它可供应用程序使用。如果没有此情况,请登录尝试将失败。

Now if you re-run the application and try to navigate to /admin, you should be redirected to the home page, with an extra query string value in the URL:

验证

您已成功启用基于Cookie的身份验证并受到保护 folder with it.

保护证书

而不是存储 数据库中的凭据,您将在标准中存储它们 appsetting.json. 文件。但是,正如您不会在平原中的数据库中存储密码 文本,您不希望在普通视线中将其存储在文本文件中。那么你 将使用散列来保护密码。这样,如果有人可以访问您的Appsettings 文件,您的密码将是安全的。你希望哈希加上密切关注 强壮的。你应该使用一个而不是饰上自己的散列算法 这是由知道他们在做什么的专家撰写的。有一个 PasswordHasher ASP.NET身份中的课程完美地完成工作。因此,您将创建一个利用它的控制台应用程序 哈希将存储在AppSettings中的密码。

  1. 使用VS,VS代码或命令创建新的.NET Core Console应用程序 线。你称之为无关紧要。这是一个一次性效用。
  2. Add the Microsoft.AspNetCore.Identity package to it - dotnet add package Microsoft.AspNetCore.Identity from the command line, or install-package Microsoft.AspNetCore.Identity 来自包裹 VS的经理控制台
  3. 更改代码 程序 看起来像这样,提供自己的 适用的密码。请注意,随后尝试匹配它将区分大小写:
  4. 运行应用程序以检查生成哈希值。保持 申请以后使用。
    哈希密码

如果您多次运行应用程序,则可能会注意到它每次生成不同的值 对于相同的密码。这是因为算法将“salt”附加到散列的密码,确保哈希每次都会有相同的密码。这使得黑客无法破解实际密码。

The PasswordHasher constructor and the HashPassword methods both take a generic parameter, representing the current user. The type parameter is not used by the default implementation. It has been made available for custom implementations. I have instantiated the PasswordHasher with a string type, and then passed null into the HashPassword 方法。

存储凭据

在本节中,您将在自定义部分中存储您的用户凭据 appsettings.json. 文件。您还将创建一个代表用户的类,以便您可以使用 以强类型方式配置值.

  1. 创建名为的文件夹 楷模 在申请的根源中。
  2. 将新的C#类文件添加到 楷模 folder and name it SiteUser.cs.
  3. 用以下内容替换现有内容:
  4. Add the SiteUser section to the appsettings.json. 使用用户名的文件 您要使用,以及您之前生成的散列密码:

创建登录表单

  1. 改变 index.chtml.cs. 文件在 页面 folder (不是 你的那个 created in the 行政 文件夹)因此内容如下所示:
    您已为您的用户名和密码添加绑定属性,您 have decorated with the DataType data annotation attribute, setting its value to Password. This is so that the input tag 帮助程序生成纠正输入类型。

    You have injected IConfiguration into the PageModel so that you can use it 解决来自AppSettings的用户凭据。检查了这一点 用户名与发布的任何内容匹配,然后您将实例化一个实例 the PasswordHasher that you used in the console application, and passed 提交的密码以及从中获取的散列版本 configuration file to its VerifyHashedPassword method.

    在内部,此方法揭示散列值,提取盐,用于散列提交的密码。如果生成的哈希匹配存储的哈希,则该方法返回a PasswordVerificationResult enumeration set to Success.
  2. 改变 index.chtml. 页面文件夹中的文件包含包含 按照形式登录:

    这是一种使用bootstrap 4的标准形式4.它将其方法设置为 post 因此,凭据未在查询字符串中传递。

现在,当您运行应用程序并使用正确的凭据登录时,您应该自动成为 重定向到管理页面。

概括

此演练显示如何强大地保护简单的应用程序,而无需在数据库中存储凭据或使用身份框架的数据访问侧。您仍然使用身份提供的一些非常有用的API,以使用专家编写的代码来保护您的凭据。您已使用相同的API将提交的值匹配到已存储的内容。 您还看到了包含和配置基于cookie的容易 身份验证,并从未验证的应用程序保护区域 users.