ASP.NET声明策略未授权

时间:2018-01-14 17:32:27

标签: asp.net asp.net-identity identityserver4 claims-based-identity

我已经设置了一个基本的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项目。有什么建议吗?

1 个答案:

答案 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