Kentor Auth服务 - 附加索赔

时间:2014-11-20 09:45:59

标签: c# owin saml-2.0 kentor-authservices

我正在评估Kentor auth services(它的OWIN版本)以使用SAML对用户进行身份验证。现在我想对该服务另外提出索赔。我可以将样本发送到服务并进行调试。

我做了一个自定义声明的身份验证管理器,在那里我可以看到到达auth服务的附加声明。但是后来(在肯德尔的例子中有一个查看主页/索引列出所有索赔)这个声明不再可用。有谁知道我做错了什么?

非常感谢!

1 个答案:

答案 0 :(得分:5)

将AuthServices(或任何外部登录)与ASP.NET Identity一起使用时,传入的声明仅用于在数据库中查找ASP.NET Identity用户。然后完全丢弃传入的用户,并加载和使用来自ASP.NET Identity的用户

在默认的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()方法。将调用解压缩到user.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);
}

建议

也可以use external login without ASP.NET Identity。如果您只使用Idp中的身份而没有其他登录方法,则可能更容易使用。