ASP.NET Core 5授权策略未检测到声明



我正在创建一个带有ASP.NET Core 5和Identity Framework的web API来处理用户。我正试图添加一个授权策略,该策略要求用户具有";canEdit"宣称在我的启动类中,我在ConfigureServices方法中添加了以下代码:

services.AddAuthorization(options => 
{
options.AddPolicy("IsUser", policy => policy.RequireAuthenticatedUser());
options.AddPolicy("CanEdit", policy => policy.RequireClaim("canEdit"));
}

在我的配置类中,我有:

// some middleware
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints => 
{
endpoints.MapControllers()
});

我在我的控制器中使用了这样的策略:

[HttpGet("edit")]
[Authorize(Policy = "CanEdit")]
public async Task<IActionResult> EditSomething()
{
\Stuff here
}

";IsUser";政策有效,但;CanEdit"政策没有。我有一个用户;canEdit"在AspNetUserClaims表中声明,但是当我尝试使用该用户登录时,我仍然得到403 Forbidden响应。我使用JSON web令牌进行身份验证。我尝试添加一个";canEdit"声明JWT中的声明列表,认为可能在令牌中检测到了该声明,但这也不起作用。我已经通过使用检查了用户是否首先拥有索赔

var userClaims = await _userManager.GetClaimsAsync(currentUser);

并且正确的权利要求显示。我尝试将该策略添加到其他控制器的其他方法中,并检查了索赔的资本化和不同名称,但没有成功。我在这里错过了什么;CanEdit"政策是否有效?

编辑:如果有帮助的话,以下是我创建JWT的方法:

public async Task<string> CreateToken(AppUser user)
{
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["jwtSecret"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha512Signature);

var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, user.Id),
new Claim(ClaimTypes.Name, user.DisplayName),
new Claim(ClaimTypes.Email, user.Email)
};
var userClaims = await _userManager.GetClaimsAsync(user);
claims.AddRange(userClaims);
var tokenDescriptor = new SecurityTokenDescriptor{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.Now.AddDays(1),
SigningCredentials = creds
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}

感谢@TarikGen的建议,我检查了HttpContext.User中的声明,并设法发现了问题。

我在AspNetUserClaims表中对";canEdit"实际上具有索赔类型";角色";,这是问题的根源。我所要做的就是将索赔类型更改为"索赔类型";canEdit"以解决问题。

额外注意:我确实注意到,由于我的错误;角色;似乎是索赔类型的关键字,因为HttpContext.User中的索赔列表显示了索赔类型";http://schemas.microsoft.com/ws/2008/06/identity/claims/role",而不仅仅是";角色";。经过检查,我发现,如果我将政策制定为RequireClaim("角色"(,我将因此而未经授权。

相关内容

最新更新