我正在尝试使用 adfs 授权应用程序。很多天我都认为问题出在授权本身
如何根据来自有效负载声明 JWT 的角色访问 REST 端点
但是我发现在 adfs 中你有一个颁发者路径,但也有一个 access_token_issuer。在分析了对 adfs 的调用之后,我发现发行者和访问令牌发行者都需要以某种方式指定。如果没有发行者,就无法访问众所周知的内容,如果没有访问令牌发行者,则不会再次检查令牌是否为正确的发行者。有没有人经历过这个并且知道如何修改 JWT 解码器以使用发行者和访问令牌发行者。
issueruri = adfs uri that has also the well known config
accessIssuerUri = the one that I receive in the claims in the iss
@Bean
public JwtDecoder jwtDecoder() {
return NimbusJwtDecoder.withIssuerLocation(this.issuerUri).build();
}
完整的代码也在我作为链接添加的问题中。
openId 配置包含类似这样的内容
{
"issuer": "https://base-url/adfs",
"authorization_endpoint": "https://base-url/adfs/oauth2/authorize/",
"token_endpoint": "https://base-url/adfs/oauth2/token/",
"jwks_uri": "https://base-url/adfs/discovery/keys",
....
"access_token_issuer": "http://base-url/adfs/services/trust",
.....
}
发行者或 access_token_issuer 是我必须在解码器和应用程序属性中添加的发行者或 access_token_issuer
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri:
jwk-set-uri:
在 yaml 中设置
jwk-set-uri
,并在 openid 配置中使用 jwks_uri
的值,并且:
issuer-uri
issuer-uri
设置为 exactly 访问令牌中 iss
声明的值(大小写和尾部斜杠(如果有)很重要)Spring Security 使用
issuer-uri
来做两件事(如果存在的话):
jwk-set-uri
属性(并且仅在这种情况下),请尝试从众所周知的路径获取OpenID配置并尝试从中获取jwks_uri
iss
声明是否正是您提供的 issuer-uri
值)发行人验证是可选的(以及受众验证)。唯一需要的验证是令牌签名,这是 Spring Security 需要 JWK 集的原因(显式提供或从颁发者 URI 推断)。