在 Asp.Net MVC 中验证自定义用户类

Posted

技术标签:

【中文标题】在 Asp.Net MVC 中验证自定义用户类【英文标题】:Authenticate custom user class in Asp.Net MVC 【发布时间】:2017-07-01 15:00:50 【问题描述】:

我有一个系统,它使用内置的身份系统来验证管理部分的用户。

我想让其他用户通过外部 Web 服务登录,但想知道我是否可以为他们创建一个不同的用户类并仍然利用 [Authorize] 属性等内置功能。

假设自定义类如下所示:

public class CustomUser

    public string Name  get; set; 
    public string Ssn  get; set; 

我会将此用户添加到一个角色中,例如“customUser”,所以在控制器中我想使用这样的授权属性:

[Authorize(Roles="customUser")]
public ActionResult DoStuff()

    // do stuff

这可能吗,有一个自定义用户类并手动验证他吗?

【问题讨论】:

【参考方案1】:

当然。只需从 ApplicationUser 继承(或任何您命名的 IdentityUser 派生类):

public class CustomUser : ApplicationUser

    public string Name  get; set; 
    public string Ssn  get; set; 

但是,您不能像示例代码所建议的那样直接将其与 Authorize 一起使用。你要么需要:

    在您的操作中执行自定义检查以验证用户类型。

    向用户添加角色并通过该自定义角色进行授权。

    创建一个自定义的AuthorizeAttribute,检查用户的类型是否正确

更新

当您从ApplicationUser 继承时,您不会获得单独的表。 EF 将向dbo.AspNetUsers 添加一个Discriminator 列,该列的值将是“ApplicationUser”或“CustomUser”,具体取决于保存的是哪个。然后,当您从数据库中查询用户时,EF 将使用此列来实例化相应的类。

需要注意的一点是UserManager 实际上是UserManager<ApplicationUser> 的一个实例。它是一个泛型类,因此在实例化时将任何用户类指定为类型参数都将是 UserManager 操作的类。因此,如果您想使用CustomUser,您将需要一个UserManager<CustomUser> 的实例。

【讨论】:

好的,太棒了。我只是没有意识到如何保存这个自定义用户并对他进行身份验证。我将为他创建一个新的数据库表,其中包含所有 CustomUser 字段和一些 ApplicationUser 字段。我可以创建 CustomUser 并使用身份 UserManager 进行身份验证吗? 非常感谢您的帮助。如果你不介意,我还有最后一个问题。我是否需要创建一个新的 SignInManager 才能手动验证 CustomUser?或者有更简单的方法吗?

以上是关于在 Asp.Net MVC 中验证自定义用户类的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC5 自定义身份验证

自定义属性的 ASP.NET MVC 客户端验证

ASP.Net MVC:如何自定义验证消息显示

ASP .Net MVC 3:自定义不显眼的验证

如何在 ASP.NET MVC 5 中实现自定义身份验证

在 Asp.net Core MVC 中定义自定义客户端验证规则