使用身份服务器 4 保护 asp.net web api 2 项目
protect asp.net web api 2 project with identity server 4
我有一个 asp.net web api 2 项目,带有 .Net framework 4.8 和一个集中式 Identity Server 4 项目。我想在我的 web api 2 项目中验证从 IS4 生成的 jwt/access 令牌。我可以理解这是一个重复的问题,但不知何故我无法找到任何合适的帮助,而且我不确定缺少什么。我在网络 api 项目中使用 IdentityServer3.AccessTokenValidation
进行令牌验证。
Startup.cs
using IdentityServer3.AccessTokenValidation;
using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(WebApplicationApiNew.Startup))]
namespace WebApplicationApiNew
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = "https://localhost:44373",
RequiredScopes = new[] { "api1" },
});
}
}
}
使用有效的 JWT 持有者令牌调用此 API 仍然会给出 401:
[Authorize]
[HttpPost]
public String GetName1()
{
if (User.Identity.IsAuthenticated)
{
var identity = User.Identity as ClaimsIdentity;
if (identity != null)
{
IEnumerable<Claim> claims = identity.Claims;
}
return "Valid";
}
else
{
return "Invalid";
}
}
错误详情:
2021-07-24 20:41:25.4133|DEBUG|Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationMiddleware|Authentication failed
Microsoft.IdentityModel.Tokens.SecurityTokenInvalidAudienceException: IDX10214: Audience validation failed. Audiences: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'. Did not match: validationParameters.ValidAudience: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]' or validationParameters.ValidAudiences: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'.
at Microsoft.IdentityModel.Tokens.Validators.ValidateAudience(IEnumerable`1 audiences, SecurityToken securityToken, TokenValidationParameters validationParameters)
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateAudience(IEnumerable`1 audiences, JwtSecurityToken jwtToken, TokenValidationParameters validationParameters)
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateTokenPayload(JwtSecurityToken jwtToken, TokenValidationParameters validationParameters)
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken& validatedToken)
at Microsoft.Owin.Security.Jwt.JwtFormat.Unprotect(String protectedText)
at Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationHandler.<AuthenticateCoreAsync>d__3.MoveNext()
错误显示:
IDX10214: Audience validation failed
如果您的 JWT 令牌包含“aud”声明,则身份验证中间件
正在尝试验证受众声明,但您的选项中没有指定受众。您可以尝试以下方法之一吗:
在选项中设置受众:
观众=“[你的观众]”
在选项中禁用观众验证:
TokenValidationParameters.ValidateAudience = false;
有关详细信息,请参阅身份服务器文档:
https://docs.identityserver.io/en/latest/topics/apis.html
我找到了解决问题的方法。 IS3 要求 aud
声明(url 中的 /resources
)出现在 jwt/access 令牌中以验证令牌。但另一方面,IS4 已默认停止发出 aud
声明。因此我们需要显式设置 IS4 服务器以发出 aud
声明以支持 legacy/old 访问令牌验证 IdentityServer3.AccessTokenValidation
.
services.AddIdentityServer(options =>
{
...
options.EmitStaticAudienceClaim = true; // <- for older access token validation
})
.AddDeveloperSigningCredential()
.AddInMemoryPersistedGrants()
.AddInMemoryIdentityResources(Config.GetIdentityResources())
...
我有一个 asp.net web api 2 项目,带有 .Net framework 4.8 和一个集中式 Identity Server 4 项目。我想在我的 web api 2 项目中验证从 IS4 生成的 jwt/access 令牌。我可以理解这是一个重复的问题,但不知何故我无法找到任何合适的帮助,而且我不确定缺少什么。我在网络 api 项目中使用 IdentityServer3.AccessTokenValidation
进行令牌验证。
Startup.cs
using IdentityServer3.AccessTokenValidation;
using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(WebApplicationApiNew.Startup))]
namespace WebApplicationApiNew
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = "https://localhost:44373",
RequiredScopes = new[] { "api1" },
});
}
}
}
使用有效的 JWT 持有者令牌调用此 API 仍然会给出 401:
[Authorize]
[HttpPost]
public String GetName1()
{
if (User.Identity.IsAuthenticated)
{
var identity = User.Identity as ClaimsIdentity;
if (identity != null)
{
IEnumerable<Claim> claims = identity.Claims;
}
return "Valid";
}
else
{
return "Invalid";
}
}
错误详情:
2021-07-24 20:41:25.4133|DEBUG|Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationMiddleware|Authentication failed
Microsoft.IdentityModel.Tokens.SecurityTokenInvalidAudienceException: IDX10214: Audience validation failed. Audiences: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'. Did not match: validationParameters.ValidAudience: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]' or validationParameters.ValidAudiences: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'.
at Microsoft.IdentityModel.Tokens.Validators.ValidateAudience(IEnumerable`1 audiences, SecurityToken securityToken, TokenValidationParameters validationParameters)
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateAudience(IEnumerable`1 audiences, JwtSecurityToken jwtToken, TokenValidationParameters validationParameters)
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateTokenPayload(JwtSecurityToken jwtToken, TokenValidationParameters validationParameters)
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken& validatedToken)
at Microsoft.Owin.Security.Jwt.JwtFormat.Unprotect(String protectedText)
at Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationHandler.<AuthenticateCoreAsync>d__3.MoveNext()
错误显示:
IDX10214: Audience validation failed
如果您的 JWT 令牌包含“aud”声明,则身份验证中间件 正在尝试验证受众声明,但您的选项中没有指定受众。您可以尝试以下方法之一吗:
在选项中设置受众:
观众=“[你的观众]”
在选项中禁用观众验证:
TokenValidationParameters.ValidateAudience = false;
有关详细信息,请参阅身份服务器文档:
https://docs.identityserver.io/en/latest/topics/apis.html
我找到了解决问题的方法。 IS3 要求 aud
声明(url 中的 /resources
)出现在 jwt/access 令牌中以验证令牌。但另一方面,IS4 已默认停止发出 aud
声明。因此我们需要显式设置 IS4 服务器以发出 aud
声明以支持 legacy/old 访问令牌验证 IdentityServer3.AccessTokenValidation
.
services.AddIdentityServer(options =>
{
...
options.EmitStaticAudienceClaim = true; // <- for older access token validation
})
.AddDeveloperSigningCredential()
.AddInMemoryPersistedGrants()
.AddInMemoryIdentityResources(Config.GetIdentityResources())
...