.Net 4.5自定义声明未重新创建

时间:2013-03-15 11:01:29

标签: .net-4.5 wif claims-based-identity asp.net-4.5

我已经搜索了这个主题,而且只是变得更加困惑。

我们有一个Forms Authentication Web应用程序。我已经将旧的FormsAuthentication.SetCookie语句更改为创建包含FormsIdentity的GenericPrincipal,然后我添加了几个自定义声明,然后使用SessionAuthenticationModule编写了sessionsecuritytokentocookie。我对FederatedAuthentication稍微感到困惑 - 我使用FederatedAuthentication.SessionAuthenticationModule来编写令牌,但我认为这与在我的情况下使用模块(“SessionAuthenticationModule”)相同?

无论如何,身份验证工作正常但我的自定义声明没有被重新创建。我没有使用会员提供者或角色提供者 - 这有关系吗?

我已经阅读了有关SessionAuthenticationModules,ClaimsAuthenticationManagers,ClaimsTransformationModules的内容,但我不再确定我应该使用哪些内容或如何使用?目前我只是将我的声明添加到旧登录代码的位置(我没有时间重写整个登录过程)并且我希望在每次请求时自动重新创建这些声明。

我需要做什么 - 显然我不想每次都要去数据库重建它们 - 我认为它们存储在cookie中并自动重新创建。

2 个答案:

答案 0 :(得分:1)

您的方法很好 - 您创建了一个包含所需声明的ClaimsPrincipal并写出会话cookie。无需声明身份验证管理器。

可能的陷阱:

  • 确保在创建ClaimsIdentity时设置身份验证类型 - 否则客户端将不会通过身份验证
  • 默认会话cookie需要SSL(浏览器不会通过纯文本重新发送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;
    }