首页 文章

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

提问于
浏览
9

我使用Windows身份验证的ASP.NET Core(基于.NET Framework) . 重点是,我需要在该用户上添加角色声明,并且此角色存储在远程数据库中 .

我已经阅读了很多关于OWIN / Cookie / UserManager / UserStore / Identity等的内容,以至于我迷失了 .

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

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

谢谢

3 回答

  • 1

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

    创建我自己的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(/* */)

  • 7

    除了答案之外,我刚刚找到了在asp .net核心中完全预定义的答案 . 当您添加声明时:

    var claims = new List<Claim>
    {
        new Claim(ClaimTypes.Name, UserName),
        new Claim(ClaimTypes.Role, "User"),
        new Claim(ClaimTypes.Role, "Admin"),
        new Claim(ClaimTypes.Role, Watever)
    };
    

    之后你可以像上面说的那样使用它:

    [Authorize(Roles = "Watever")]
    

    要么

    User.IsInRole("Watever")
    
  • 2

    您可以在数据库中添加新角色(AspNetRoles),然后将其分配给用户(AspNetUserRoles) .

相关问题