ASP.NET MVC 中的自定义身份验证和授权






4.75/5 (6投票s)
ASP.NET MVC 中的自定义身份验证和授权
当我们使用 Internet 作为项目模板时,ASP.NET MVC 会为我们提供基本的授权和身份验证功能。它完成了诸如角色成员资格管理、登录凭据验证处理等大部分功能。有关 MVC 应用程序中基本授权的更多信息,请在此处查看我们的文章“深入了解 ASP.NET MVC 的 Authorize 属性”。
简而言之,我们只需使用名为 Authorize
的特性来装饰我们的控制器和操作方法,即可限制匿名用户。这将把匿名用户重定向到登录页面,并且通过一些重写,我们还可以将他们导航到自定义错误页面。但如果我们要开发更具企业级的、安全性至关重要的应用程序,那么它不够灵活。
因此,我们有了自定义ASP.NET MVC 中的授权和身份验证的概念,让我们花点时间来探索一下。
ASP.NET MVC 中的自定义成员资格提供程序
MVC 为我们提供了几个 .NET 内置的成员资格提供程序,实现和使用它们非常简单,但如前所述,它并没有提供足够的灵活性来增强我们的安全性。另一种选择是实现自己的提供程序。
您可能已经注意到,在实现 .NET 提供的默认成员资格时,会创建一个与身份验证和授权相关的架构表,并持久化最终用户创建的凭据。这种解决方法是自动完成的,但在自定义身份验证的情况下,需要从头开始创建,或者可以使用现有应用程序中已有的架构系统。
设置数据库
- 如果您已经配置了安全数据库,那么您可以跳过此步骤,否则,让我们创建 ASP.NET 安全数据库。
- 打开 Visual Studio 命令提示符并键入命令“
aspnet_regsql
”。 - 这将弹出一个 SQL 向导,单击“下一步”。
- 您可以在此处决定是继续使用现有数据库还是替换安全数据库。
- 提供您的服务器名称和数据库,向导将自动加载 ASPNET 安全架构表。
创建自定义成员资格
- 打开 Visual Studio 2012 或更高版本,然后创建一个类库项目。
- 现在是时候引用一个名为
System.Web.ApplicationServices
的程序集了。此命名空间为我们提供了各种类,使我们能够访问窗体身份验证、角色和配置文件应用程序服务。要引用程序集,请右键单击“引用”文件夹,然后选择“添加引用”,再选择“程序集”。搜索或滚动查找前面提到的相应命名空间并添加它。 - 在此处创建您的自定义身份验证类,例如
WebDevelopmentCustomAuth
,并从MembershipProvider
类派生。 MembershipProvider
为我们提供了一个名为“ValidateUser()
”的方法,这是需要重写的方法。
将自定义身份验证实现到 ASP.NET MVC4 客户端
- 创建一个全新的 ASP.NET MVC 4 应用程序(模板项目可以是 Internet)。
- 我们可以替换或在我们的 Web.Config 文件中添加一些成员资格标签,将其映射到我们的自定义身份验证类库。
- 现在,像往常一样使用
Authorize
特性来装饰所需的控制器或操作方法。 - 重要的是,我们需要在 Web Config 文件中关闭简单成员资格和自动窗体身份验证。
<add key= “enableSimpleMembership” value= “false” /> <add key= “autoFormsAuthentication” value= “false” />
- 现在通过按 F5 运行应用程序,然后导航到用
Authorize
特性装饰的操作方法。 - 您将按预期导航到登录页面。
自定义授权(角色提供程序)
- 在我们之前的类库项目中,创建一个名为
CustomRoleProvider
的类,该类继承自RoleProvider
类。 RoleProvider
类为我们提供了处理角色的方法,称为GetRoleForUser()
。- 我们可以用自己的逻辑重写该特定函数。
- 现在,在我们前面创建的MVC 4 客户端项目中,打开 Web.Config 文件并添加或替换
RoleManager
部分,如下所示。 - 然后,使用名为
Roles
的属性来装饰ActionMethod
的 Authorize 属性。 - 如果我们再次运行应用程序并导航到已装饰的
ActionMethod
,那么只有当您的用户名拥有 Administrator 角色时,您才能看到登录。
我们还可以利用第三方身份验证,例如Google、Microsoft、Facebook 等。这可以通过将我们的 WebDevelopmentCustomAuth
类从 ExtendedMembershipProvider
类派生来实现,其中该类具有 MembershipProvider
类作为其基类。我们还需要引用一个名为 WebMatrix.WebData
的程序集,并可以操作 AccountController
来利用其他社交类型的身份验证。
自定义授权和身份验证为我们提供了实现安全性的足够灵活性,这是一个相当广泛的主题。我写了最著名的一种实现方式,希望这能帮助您学习自定义并继续保护您的应用程序。
感谢阅读,让您的应用程序坚不可摧!