使用OpenID对接Azure AD的ASP.NET 4.7.2应用无法获取自定义声明
你需要依次检查和补充以下配置:
1. 关闭JWT入站声明自动映射
System.IdentityModel.Tokens.Jwt 库默认会自动将JWT中的声明映射为.NET内置的ClaimType常量,无法匹配的自定义声明会被直接丢弃。你需要在TokenValidationParameters中显式关闭该逻辑:
TokenValidationParameters = new TokenValidationParameters() { ValidateAudience = false, ValidateIssuer = true, ValidIssuer = AUTHORITY, IssuerSigningKey = key, // 新增这一行 MapInboundClaims = false },
2. 配置OpenID Connect协议的可选声明
你之前配置的自定义声明仅对SAML协议生效,OpenID Connect协议需要单独配置返回的声明:
进入Azure AD对应应用注册的清单页,找到optionalClaims节点,将你需要的声明添加到idToken数组中,示例配置如下:
"optionalClaims": { "idToken": [ { "name": "given_name", "essential": false }, { "name": "family_name", "essential": false }, { "name": "email", "essential": false }, { "name": "department", "source": "user", "essential": false } ] }
如果需要保留和SAML响应一致的http://schemas.xmlsoap.org前缀的长声明名称,在对应声明的additionalProperties中添加"include_external_claim_name": true即可。
3. 补充请求的Scope范围
你当前仅请求了OpenIdProfile范围,需要补充所需声明对应的Scope,比如要获取邮箱地址需要额外添加email范围,修改配置如下:
Scope = OpenIdConnectScope.OpenIdProfile + " email",
4. 确认声明返回位置
如果你的自定义声明配置为仅在访问令牌(access_token)中返回,你需要在OnAuthorizationCodeReceived方法中用拿到的授权码兑换访问令牌,解析访问令牌获取自定义声明后,手动将声明添加到当前的ClaimsIdentity中,后续控制器的ClaimsPrincipal就能读取到这些声明。
内容的提问来源于stack exchange,提问作者Caspian Canuck
相关产品推荐
相关产品推荐

