IdentityServer4 ADFS 外部不返回角色
Posted
技术标签:
【中文标题】IdentityServer4 ADFS 外部不返回角色【英文标题】:IdentityServer4 ADFS External Not Returning Roles 【发布时间】:2021-10-06 02:06:24 【问题描述】:我使用核心身份的标准模板创建了一个 IdentityServer4 IDP。我希望有一个外部提供商退出 ADFS 2016 服务器。我已将此添加到 Startup.cs 中的 AddAuthentication()
services.AddAuthentication()
.AddOpenIdConnect("adfs", "ADFS", options =>
options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
options.SignOutScheme = IdentityServerConstants.SignoutScheme;
options.Authority = "[AuthURL]";
options.ClientId = "[ClientId]";
options.ResponseType = "id_token token code";
options.Scope.Add("profile");
options.Scope.Add("email");
options.CallbackPath = "/signin-adfs";
options.SignedOutCallbackPath = "/signout-callback-adfs";
options.RemoteSignOutPath = "/signout-adfs";
options.ClaimActions.Add(new JsonKeyClaimAction("role", null, "role"));
options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
NameClaimType = "name",
RoleClaimType = "role"
;
);
它成功重定向到 ADFS 登录窗口。登录后,它会正确调用 ExternalController.cs CallBack() 并且我确实有成功的身份验证。
public async Task<IActionResult> Callback()
// read external identity from the temporary cookie
var result = await HttpContext.AuthenticateAsync(IdentityServerConstants.ExternalCookieAuthenticationScheme);
if (result?.Succeeded != true)
throw new Exception("External authentication error");
我遇到的问题是我没有找回完整的用户。我看到索赔,但我没有看到角色。我习惯于看到一个包含角色列表的 JWT 令牌,但是,我在上面的结果中看不到这些角色。
如何从针对 ADFS 的身份验证中获取 JWT 令牌,或者返回角色并在结果中?
【问题讨论】:
【参考方案1】:在 OIDC 内部添加角色范围:
options.Scope.Add("roles");
在 IDS4 中的 config.cs 中确保您的客户端具有允许的范围:
AllowedScopes =
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
IdentityServerConstants.StandardScopes.Email,
IdentityServerConstants.StandardScopes.OfflineAccess,
"roles",
,
如果是 API,请确保 config.cs 具有正确的用户声明:
new ApiResource()
Name = "API",
DisplayName = "display",
ApiSecrets =
new Secret("secret".Sha256()),
new Secret
Value = "4A04D56554F731CCD123BB574D6918C8C83BDF65",
Type = "X509Thumbprint",
Description = "Certificate"
,
Scopes = new List<string>()"postman Web API",
Enabled = true,
UserClaims =
JwtClaimTypes.Name,
JwtClaimTypes.Email,
JwtClaimTypes.Subject,
JwtClaimTypes.Role,
JwtClaimTypes.Address,
JwtClaimTypes.Confirmation,
JwtClaimTypes.EmailVerified,
JwtClaimTypes.Id,
JwtClaimTypes.Profile
,
【讨论】:
现在我没有任何客户使用 IDP,我正在查看返回的结果,即 Principal.Identity 和 Principal.Claims。我添加了角色的范围,但我仍然看不到身份中的角色列表。以上是关于IdentityServer4 ADFS 外部不返回角色的主要内容,如果未能解决你的问题,请参考以下文章
来自身份服务器 3 的外部登录(通过 ADFS)响应 http 状态代码 504
如何将 IdentityServer4 设置为外部身份提供者
没有 cookie 的 IdentityServer4 外部身份验证
ASP.NET Identity(使用 IdentityServer4)获取外部资源 oauth 访问令牌