ASP.NET核心 - 向用户添加角色声明

问题描述:

我有一个使用Windows身份验证的ASP.NET核心(基于.NET Framework)。要点是,我需要为该用户添加角色声明,并且此角色存储在远程数据库中。ASP.NET核心 - 向用户添加角色声明

我读过很多关于OWIN/Cookie/UserManager/UserStore/Identity等的东西,我迷路了。

问:如何以最简单的方式为当前用户登录(Windows)为整个应用程序添加角色声明?

我需要的是能够轻松使用[Authorize(Role= "MyAddedRole")]bool res = User.IsInRole("MyAddedRole")

感谢

回答自己,所以我做了什么:

创建我自己的UserClaimStore(我只需要这家店,而不是其他人):

public class MyIdentityStore : 
    IUserClaimStore<IdentityUser> 
{ 
    private MyDbContext _myDbContext; 
    private bool _disposed = false; 

    public MyIdentityStore(MyDbContext myDbContext) 
    { 
     _myDbContext = myDbContext; 
    } 

    #region IUserClaimStore 
    public Task<IList<Claim>> GetClaimsAsync(IdentityUser user, CancellationToken cancellationToken) 
    { 
     // logic here to retrieve claims from my own database using _myDbContext 
    } 

    // All other methods from interface throwing System.NotSupportedException. 
    #endregion 

    #region IDisposable Support 

    protected virtual void Dispose(bool disposing) 
    { /* do cleanup */ } 
    #endregion 
} 

然后创建了自己的ClaimTransformer:

public class MyClaimsTransformer : IClaimsTransformer 
{ 
    private UserManager<IdentityUser> _userManager; 

    public MyClaimsTransformer(UserManager<IdentityUser> userManager) 
    { 
     _userManager = userManager; 
    } 

    public async Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context) 
    { 
     var identity = ((ClaimsIdentity)context.Principal.Identity); 

     // Accessing the UserClaimStore described above 
     var claims = await _userManager.GetClaimsAsync(new IdentityUser(identity.Name)); 
     identity.AddClaims(claims); 

     return await Task.FromResult(context.Principal); 
    } 
} 

最后,在Startup.cs中:

public void ConfigureServices(IServiceCollection services) 
    { 
     /* All other stuff here */ 

     // Adding Database connection 
     services.AddDbContext<MyDbContext>(o => /* my options */); 

     // Associates our database and store to identity 
     services.AddIdentity<IdentityUser, IdentityRole>() 
      .AddEntityFrameworkStores<MyDbContext>() 
      .AddUserStore<MyIdentityStore>(); 

     // Claims transformation from database to claims 
     services.AddTransient<IClaimsTransformer, MyClaimsTransformer>(); 
    } 


    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     /* All other stuff here */ 

     app.UseIdentity(); 

     app.UseClaimsTransformation(async (context) => 
     { // Retrieve user claims from database 
      IClaimsTransformer transformer = context.Context.RequestServices.GetRequiredService<IClaimsTransformer>(); 
      return await transformer.TransformAsync(context); 
     }); 
    } 

现在我可以自由使用[Authorize(Roles = "MyRole")]User.IsInRole("MyRole")甚至User.HasClaim(/* */)

+0

您能否更详细地解释如何从数据库中检索角色的定义并将其分配给用户? – iAziz

您可以在DB(AspNetRoles)添加一个新的角色,然后将其分配给用户(AspNetUserRoles)。

+0

我需要读取一个特定的表“MyTable”并执行特定的SELECT来获取角色。 –

+0

然后你必须更新你的登录方法就像这里:https://stackoverflow.com/questions/35153541/add-claims-on-successful-login-and-retrieve-it-elsewhere-in-the-application – vhr

+0

但我没有登录方法,我使用Windows身份验证,所以用户从开始就知道,我没有登录页面,没有登录方法。 –