asp.net-identity - .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;
....
要改变什么才能让它工作?
解决方案
推荐阅读
- aws-lambda - 如何减小 lambda 的大小(以减少冷启动时间)>> 我们可以使用层吗?
- java - 如何在 Spring Boot 中模拟 ApplicationContext.getAutowireCapableBeanFactory
- c# - 如何使用 ZedGraph 限制 X 轴上的平移?
- wordpress - 获取特色图像原始尺寸的功能 - 全尺寸
- c# - blazor identity 脚手架 ANCM 同一进程中的多个进程内应用程序
- typescript - 自定义标头已从我的请求中删除
- r - 通过 SDMX(XML) 从 OECD 获取数据到 R
- android - Flutter 1.12 后如何禁用 proguard?
- php - 类似于 Laravel 的打字稿填充()
- python - Pandas - 提取唯一的列组合并将它们计算在另一个表中