在 Asp.Net MVC 中验证自定义用户 class
Authenticate custom user class in Asp.Net MVC
我有一个系统使用内置身份系统来验证管理部分的用户。
我想让其他用户通过外部 Web 服务登录,但想知道我是否可以为他们创建一个不同的用户 class 并且仍然利用 [授权] 属性等内置功能。
假设自定义 class 如下所示:
public class CustomUser
{
public string Name { get; set; }
public string Ssn { get; set; }
}
我会将这个用户添加到一个角色中,例如 "customUser" 所以在控制器中我想像这样使用授权属性:
[Authorize(Roles="customUser")]
public ActionResult DoStuff()
{
// do stuff
}
这可能吗,有一个自定义用户 class 并手动验证他吗?
当然可以。只需继承 ApplicationUser
(或任何你命名为 IdentityUser
派生的 class):
public class CustomUser : ApplicationUser
{
public string Name { get; set; }
public string Ssn { get; set; }
}
但是,您不能像您的示例代码所建议的那样直接将它与 Authorize
一起使用。您需要:
在您的操作中进行自定义检查以验证用户类型。
为用户添加角色并通过该自定义角色授权。
创建自定义 AuthorizeAttribute
检查用户类型是否正确
更新
当您从 ApplicationUser
继承时,您将不会获得单独的 table。 EF 将向 dbo.AspNetUsers
添加一个 Discriminator
列,其值将是 "ApplicationUser" 或 "CustomUser",具体取决于保存的是哪个。当您从数据库中查询用户时,EF 将使用此列来实例化适当的 class。
需要注意的一件事是 UserManager
实际上是 UserManager<ApplicationUser>
的一个实例。它是一个通用的 class,因此当实例化时将 class UserManager
操作时,无论用户 class 被指定为类型参数。因此,如果您想使用 CustomUser
,您将需要一个 UserManager<CustomUser>
的实例。
我有一个系统使用内置身份系统来验证管理部分的用户。
我想让其他用户通过外部 Web 服务登录,但想知道我是否可以为他们创建一个不同的用户 class 并且仍然利用 [授权] 属性等内置功能。
假设自定义 class 如下所示:
public class CustomUser
{
public string Name { get; set; }
public string Ssn { get; set; }
}
我会将这个用户添加到一个角色中,例如 "customUser" 所以在控制器中我想像这样使用授权属性:
[Authorize(Roles="customUser")]
public ActionResult DoStuff()
{
// do stuff
}
这可能吗,有一个自定义用户 class 并手动验证他吗?
当然可以。只需继承 ApplicationUser
(或任何你命名为 IdentityUser
派生的 class):
public class CustomUser : ApplicationUser
{
public string Name { get; set; }
public string Ssn { get; set; }
}
但是,您不能像您的示例代码所建议的那样直接将它与 Authorize
一起使用。您需要:
在您的操作中进行自定义检查以验证用户类型。
为用户添加角色并通过该自定义角色授权。
创建自定义
AuthorizeAttribute
检查用户类型是否正确
更新
当您从 ApplicationUser
继承时,您将不会获得单独的 table。 EF 将向 dbo.AspNetUsers
添加一个 Discriminator
列,其值将是 "ApplicationUser" 或 "CustomUser",具体取决于保存的是哪个。当您从数据库中查询用户时,EF 将使用此列来实例化适当的 class。
需要注意的一件事是 UserManager
实际上是 UserManager<ApplicationUser>
的一个实例。它是一个通用的 class,因此当实例化时将 class UserManager
操作时,无论用户 class 被指定为类型参数。因此,如果您想使用 CustomUser
,您将需要一个 UserManager<CustomUser>
的实例。