我已经设置了一个基本的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();
}
问题是当我迭代user.claims时没有任何角色。只有电子邮件,名称等等。在SqlDB中,我创建的角色只存在。这些其他存在的名称和电子邮件都不在DB中。所以某处存在脱节。我使用IdentityServer4的Quickstart EFandAspNetIdentity模板作为我的基础,如果有人熟悉它。
我用Google搜索了所有内容,到目前为止我找不到任何内容。我认为有两个独立的存储正在进行,而cookie只是将其中一个传递给webmvc项目。有什么建议吗?
答案 0 :(得分:0)
确保在将身份令牌传递给客户时将其包含在身份令牌中。
客户端配置应包含以下行: -
new Client
{
ClientId = "yourclient",
ClientName = "Your Client",
// left out for brevity
AlwaysSendClientClaims = true,
AlwaysIncludeUserClaimsInIdToken = true
}
这应该允许所有用户声称通过。
你可以看一下我之前回答的这个问题,以获取更多信息,以及我的回购中的一个例子: -
IdentityServer4 custom AuthenticationHandler can't find all claims for a user