我已经搜索了这个主题,而且只是变得更加困惑。
我们有一个Forms Authentication Web应用程序。我已经将旧的FormsAuthentication.SetCookie语句更改为创建包含FormsIdentity的GenericPrincipal,然后我添加了几个自定义声明,然后使用SessionAuthenticationModule编写了sessionsecuritytokentocookie。我对FederatedAuthentication稍微感到困惑 - 我使用FederatedAuthentication.SessionAuthenticationModule来编写令牌,但我认为这与在我的情况下使用模块(“SessionAuthenticationModule”)相同?
无论如何,身份验证工作正常但我的自定义声明没有被重新创建。我没有使用会员提供者或角色提供者 - 这有关系吗?
我已经阅读了有关SessionAuthenticationModules,ClaimsAuthenticationManagers,ClaimsTransformationModules的内容,但我不再确定我应该使用哪些内容或如何使用?目前我只是将我的声明添加到旧登录代码的位置(我没有时间重写整个登录过程)并且我希望在每次请求时自动重新创建这些声明。
我需要做什么 - 显然我不想每次都要去数据库重建它们 - 我认为它们存储在cookie中并自动重新创建。
答案 0 :(得分:1)
您的方法很好 - 您创建了一个包含所需声明的ClaimsPrincipal并写出会话cookie。无需声明身份验证管理器。
可能的陷阱:
答案 1 :(得分:0)
您需要自定义ClaimsAuthenticationManager,它将被调用一次并添加声明。不要忘记在您的应用程序中注册此自定义类:
public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal)
{
//works only with one default identity
//In contra to a a default implementation modify incomingPrincipal by adding claims)
if (incomingPrincipal != null && incomingPrincipal.Identity.IsAuthenticated == true)
{
ClaimsIdentity claimsIdentity = incomingPrincipal.Identity as ClaimsIdentity;
if (claimsIdentity != null)
{
IEnumerable<Claim> claims = new Claim[] { };
claims = claims.Concat(CreateIdsClaims(incomingPrincipal.Identity.Name));
claims = claims.Concat<Claim>(CreateRoleClaims(GetRolesByName(incomingPrincipal.Identity.Name)));
claimsIdentity.AddClaims(claims);
}
return incomingPrincipal;
}
return null;
}