c#-ASP网络身份-索赔与自定义IdentityUser

我对自定义用户配置文件以便在应用程序中实现自定义逻辑的最佳方法感到困惑.

假设您必须使用这种属性来分析用户:

>等级
> canProcess
> canWorkOffline
> canSendEmail
> canViewFullName

我必须在哪里实现这种属性?
我必须自定义IdentityUser(使用ApplicationUser)还是必须创建自定义声明?

解决方法:

两种方法都是可行的,并且有人可能会认为这是一种偏好问题.

我想说,在IdentityUser实现中仅使用添加的属性更易于访问,并且所需的代码更少.

在性能方面,我认为需要添加的用户和数据越多,属性就越好,因此数据库存储有意义,使用cookie可能会更快,但是会因大量数据的使用和服务器配置而中断,特别是如果您希望为每个用户存储大量信息,从长远来看可以更好地证明.

您还必须考虑数据持久性
如果满足以下条件之一,则必须使用属性.

>数据需要不确定地存储
>如果用户未登录,则可以或必须访问数据.

之后,这实际上是您的应用程序的口味和特定需求的问题.

考虑到您的示例,您只能使用IdentityUser属性:

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity>GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        var userIdentity = await manager.CreateIdentityAsync(this,  DefaultAuthenticationTypes.ApplicationCookie);
        return userIdentity;
    }

    //There you can use display name or any attributes like a regular Model.
    public LevelEnum Level { get; set; }
    [Display(Name = "Is allowed to process")]
    public bool CanProcess { get; set; }
    public bool CanWorkOffline { get; set; }
    public bool CanSendEmail { get; set; }
    public bool CanViewFullName { get; set; }
}

那么您可以非常轻松地访问控制器中的属性:

var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
viewModel.Level = user.Level;

设置方式相同

user.Level = viewModel.Level;

并使用UserManager保存用户:

await _userManager.UpdateAsync(user);
//or to create
await UserManager.CreateAsync(user, model.Password);

至于索赔方法:

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);

        // Add custom user claims here 
        userIdentity.AddClaim(new Claim("Level", LevelEnum.Default));

        return userIdentity;
    }

然后访问:

//claim can be null.
var claim = ((ClaimsIdentity)identity).FirstOrDefault("Level") ?? LevelEnum.Default;

当然,如果需要,您也可以将存储的属性分配给声明.
使用上面的属性示例:

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);

        // Add custom user claims here 
        userIdentity.AddClaim(new Claim(nameof(Level), Level));

        return userIdentity;
    }
上一篇:通过Python查找和分组字谜


下一篇:C#-System.IdentityModel.Policy.IAuthorizationPolicy过时了吗?