肯特授权服务 - 附加索赔
本文关键字:授权 服务 | 更新日期: 2023-09-27 18:31:04
我正在评估Kentor auth服务(它的OWIN版本)以使用SAML对用户进行身份验证。现在我想向该服务传递额外的索赔。连同那里的示例,我能够将请求发送到服务并对其进行调试。
我做了一个自定义声明身份验证管理器,在那里我可以看到到达身份验证服务的其他声明。但后来(在 Kendor 示例中,有一个列出所有声明的视图主页/索引)此声明不再可用。有人知道我做错了什么吗?
多谢!
将 AuthServices(或任何外部登录)与 ASP.NET 标识一起使用时,传入的声明仅用于在数据库中查找 ASP.NET 标识用户。然后完全丢弃传入用户,并加载和使用来自 ASP.NET 身份
的用户在默认的 MVC5 模板中,从外部标识到 ASP.NET 标识的切换在 AccountController.ExternalLoginCallback()
中完成。要保留传入的信息,您必须调整此方法。有两种选择。
1. 更新ExternalLoginCallback()
中的存储用户
// Sign in the user with this external login provider if the user already has a login
var user = await UserManager.FindAsync(loginInfo.Login);
if (user != null)
{
// Update user with info from external identity and save.
user.GivenName = loginInfo.ExternalIdentity.FindFirst(ClaimTypes.GivenName).Value;
await UserManager.UpdateAsync(user);
await SignInAsync(user, isPersistent: false);
return RedirectToLocal(returnUrl);
}
2. 仅对当前会话使用传入声明。
将SignInAsync()
的内容复制到ExternalLoginCallback()
方法。提取对用户的调用。GenerateUserIdentityAsync() to a separate line and. Add claims before calling
SignInAsync()'
// Sign in the user with this external login provider if the user already has a login
var user = await UserManager.FindAsync(loginInfo.Login);
if (user != null)
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var identity = await user.GenerateUserIdentityAsync(UserManager);
identity.AddClaim(loginInfo.ExternalIdentity.FindFirst(ClaimTypes.GivenName));
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent },
identity);
return RedirectToLocal(returnUrl);
}
建议
也可以在没有 ASP.NET 标识的情况下使用外部登录。如果您仅使用 Idp 中的身份而不使用其他登录方法,则可能更容易使用。