ASP.NET 声明策略未授权



我已经设置了一个基本的TestAdmin帐户,以便在微服务应用程序中使用基于声明的身份验证。我有相关的代码设置如下:

await userManager.AddClaimAsync(testAdmin, new Claim(ClaimTypes.Role, "NavInvoices"));

这显示在 AspNetUserClaims 数据库中,因此正在创建和保存它。 我尝试了这两种方法来设置策略(我只检查现在是否存在任何 ClaimTypes.Role):

services.AddAuthorization(options =>
{
options.AddPolicy("NavInvoices2", policy => policy.RequireClaim(ClaimTypes.Role));
});
services.AddAuthorization(options =>
{
options.AddPolicy("NavInvoices", policy =>
policy.RequireAssertion(context =>
context.User.HasClaim(c =>
(c.Type == ClaimTypes.Role))));
});

这是控制器:

[Authorize(Policy = "NavInvoices")]
public IActionResult About()
{
ViewData["Message"] = "Your application description page.";

return View();
}

问题是当我迭代用户时,声称没有角色。只有电子邮件、姓名等。在 SqlDB 中,只有我创建的角色存在。数据库中没有其他存在的东西(如姓名和电子邮件)。所以某处存在脱节。我正在使用IdentityServer4的Quickstart EFandAspNetIdentity模板作为我的基础,如果有人熟悉的话。

我已经用谷歌搜索了我能搜索的所有内容,到目前为止我什么也找不到。我认为有两个单独的存储正在进行中,而cookie只将其中一个传递给webmvc项目。有什么建议吗?

确保在将标识令牌传递给客户端时将声明包含在标识令牌中。

客户端配置应具有以下行:-

new Client
{
ClientId = "yourclient",
ClientName = "Your Client",
// left out for brevity
AlwaysSendClientClaims = true, 
AlwaysIncludeUserClaimsInIdToken = true
}

这应该允许所有用户声明通过。

您可以查看我之前回答的这个问题以获取更多信息,以及我的存储库中的一个例子:-

IdentityServer4 自定义身份验证处理程序找不到用户的所有声明

最新更新