C# Kentor认证服务-附加索赔

C# Kentor认证服务-附加索赔,c#,owin,saml-2.0,kentor-authservices,C#,Owin,Saml 2.0,Kentor Authservices,我正在评估(它的OWIN版本)以使用SAML对用户进行身份验证。现在我想对这项服务再提出一项索赔。与那里的示例一起,我能够将请求发送到服务并对其进行调试 我做了一个定制的claimsAuthenticationManager,在那里我可以看到额外的声明到达auth服务。但是后来(在Kendor示例中,有一个视图home/index列出了所有声明),该声明不再可用。有人知道我做错了什么吗 非常感谢 将AuthServices(或任何外部登录)与ASP.NET标识一起使用时,传入的声明仅用于在数据库

我正在评估(它的OWIN版本)以使用SAML对用户进行身份验证。现在我想对这项服务再提出一项索赔。与那里的示例一起,我能够将请求发送到服务并对其进行调试

我做了一个定制的claimsAuthenticationManager,在那里我可以看到额外的声明到达auth服务。但是后来(在Kendor示例中,有一个视图home/index列出了所有声明),该声明不再可用。有人知道我做错了什么吗

非常感谢

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

在默认MVC5模板中,从外部标识到ASP.NET标识的切换在
AccountController.ExternalLoginCallback()中完成。要保留传入的信息,必须调整此方法。有两种选择

1.在
ExternalLoginCallback()中更新存储的用户
2.仅对当前会话使用传入声明。
将
SignInAsync()
的内容复制到
ExternalLoginCallback()
方法。将对user.GenerateUserIdentityAsync()
的调用提取到一个单独的行中,然后重试。在调用
SignInAsync()之前添加声明`

暗示
也有可能。如果您只使用来自Idp的身份,而没有其他登录方法,那么这可能更容易使用。

我需要更多信息来提供帮助:1。您是否向Idp发送附加索赔?在这种情况下,是作为一个额外的属性还是作为一个单独的断言?2.您能出示您的
身份验证经理的代码吗?
?您好@AndersAbel谢谢您的帮助。1.是的,我是从土地发展局寄来的。我正在使用您的代码,据我所知,它已添加到现有的断言(ClaimsIdentityExtensions.ToSaml2Assertion)2中。ClaimsAuthenticationManager没有做任何事情——我只是创建它来检查是否所有的索赔都到达了那里——事实就是如此。经过较长时间的研究,我认为问题更多地出现在ApplicationUserManager或ApplicationUser上,在转换为“适当的asp用户”的过程中,它丢失了……您好@AndersAbel。非常感谢您的回复。实际上,底部的建议对我很有帮助,因为我根本不需要Asp.Net身份。我不知道为什么我以前没有在你的博客上看到那篇文章,因为我在那里读了很多。。。
// 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);
}
// 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);
}