未经授权使用ValidAudiences IdentityServer4

时间:2018-04-11 23:35:50

标签: jwt asp.net-core-2.0 identityserver4

我在ASP.NET Core 2.0上设置了IdentityServer4,一切正常,直到我尝试向api添加多个有效的受众。

这是定义api资源的Config:

public static IEnumerable<ApiResource> GetApiResources()
{
    return new List<
        new ApiResource(){
            Name ="wallets.api",
            Description ="Wallets API",
            Scopes = new List<Scope>(){
                new Scope() {
                    Name = "wallets.api",
                    DisplayName="Wallets API"
                },
                new Scope()
                {
                    Name="all.api"
                }
            }
        }
    };
}

我添加了范围“all.api”,因为我想要在多个apis上请求一个只有一个范围而不是列表的标记。

在Wallets API Startup.cs上:

services.AddAuthentication(options =>
{
    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(cfg =>
{
    cfg.Authority = Configuration["JWTSettings:JWTIssuer"];
    cfg.RequireHttpsMetadata = false;
    cfg.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidAudiences = new List<string>
        {
            "wallets.api",
            "all.api"
        },
        ValidateAudience = true
    };
});

我尝试使用范围“wallets.api”对Postman进行身份验证并收到访问令牌,我可以毫无问题地向Wallets API发送请求。

但是,如果我将其更改为all.api,当我向Wallets API发送请求时,我会获得401 Unauthorized。

这是客户端配置

public static IEnumerable<Client> GetClients()
{

    return new List<Client>
    {

        // resource owner password grant client
        new Client
        {
            ClientId = "mobile",
            AllowedGrantTypes = new List<string>(){"password"},

            ClientSecrets =
            {
                new Secret("secret".Sha256())
            },
            AllowedScopes = {
                IdentityServerConstants.StandardScopes.OpenId,
                IdentityServerConstants.StandardScopes.Profile,
                IdentityServerConstants.StandardScopes.Email,
                IdentityServerConstants.StandardScopes.Address,
                "wallets.api",
                "all.api"
            },
            AllowOfflineAccess = true,
            AllowedCorsOrigins = new List<string>(){"http://localhost:5000"}
        }
    };
}

我做错了吗?

编辑:

有趣的是,使用wallets.api范围请求的令牌将aud和scope设置为wallets.api

 "aud": [
    "http://identity.api/resources",
    "wallets.api"
 ],
 "scope": [
    "wallets.api"
  ]

但是,使用all.api范围请求的令牌只有范围,而在aud中有identity.api而不是all.api

 "aud": [
     "http://identity.api/resources",
     "identity.api"
  ],
  "scope": [
      "all.api"
  ],

编辑:

现在我尝试使用wallets.api和all.api请求一个令牌,我看到all.api只出现在作用域中

 "aud": [
     "http://identity.api/resources",
     "identity.api",
     "wallets.api"
 ],
 "scope": [
     "all.api",
     "wallets.api"
 ]

我觉得我误解了范围和观众。 all.api也需要成为api资源吗?看起来只有api资源可以成为观众

0 个答案:

没有答案