我在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资源可以成为观众