首页 > 解决方案 > .net core 2.0 中使用 Identity 的角色授权抛出 404

问题描述

我有带有身份的 .Net Core WebApi 应用程序。使用 JWT 进行授权效果很好,但是在添加基于角色的授权后 [Authorize(Roles = "Admin")] 会抛出 404。我的 GenerateJwtToken 方法是:

private async Task<object> GenerateJwtToken(string login, IdentityUser user)
    {
        var claims = new List<Claim>
        {
            new Claim(JwtRegisteredClaimNames.Sub, login),
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
            new Claim(ClaimTypes.NameIdentifier, user.Id)
        };

        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration.GetSection("JWTSettings:SecretKey").Value));
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

        var iss = _configuration.GetSection("JWTSettings:Issuer").Value;

        var token = new JwtSecurityToken(
            issuer: _configuration.GetSection("JWTSettings:Issuer").Value,
            audience: _configuration.GetSection("JWTSettings:Audience").Value,
            claims: claims, 
            signingCredentials: creds
            );

        return new JwtSecurityTokenHandler().WriteToken(token);
    }

Startup.cs 中的 ConfigureService 如下所示:

 public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<PaszoDbContext>(options =>
            options.UseSqlite("Data Source=PaszoDataBase.db"));


        services.AddIdentity<IdentityPaszoUser, IdentityRole>(o => {
            o.Password.RequireDigit = false;
            o.Password.RequiredLength = 1;
            o.Password.RequireLowercase = false;
            o.Password.RequireUppercase = false;
            o.Password.RequireNonAlphanumeric = false;

        })
            .AddEntityFrameworkStores<PaszoDbContext>()
            .AddDefaultTokenProviders();


        JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); // => remove default claims
        services
            .AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;

            })
            .AddJwtBearer(options =>
            {
                options.RequireHttpsMetadata = false;
                options.SaveToken = true;
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration.GetSection("JWTSettings:SecretKey").Value)),
                    ValidateIssuer = true,
                    ValidIssuer = Configuration.GetSection("JWTSettings:Issuer").Value,
                    ValidateAudience = true,
                    ValidAudience = Configuration.GetSection("JWTSettings:Audience").Value,
                    ValidateLifetime = false,

                };
            });
        services.AddMvc();
    }

当我测试 UserManager 是否收到有关控制器中用户和角色的信息时,它可以正常工作:

    [Authorize]//(Roles = "Admin")]
    [HttpGet]
    public List<PaszoUser> GetPaszoUsers()
    {
        var user =  _userManager.GetUserAsync(HttpContext.User).Result;
        var role =_userManager.GetRolesAsync(user).Result;
        ....

要改变什么才能让它工作?

标签: asp.net-identityasp.net-core-2.0user-roles

解决方案


推荐阅读