0

我已经搜索过这个主题,只是越来越困惑。

我们有一个表单身份验证 Web 应用程序。我更改了旧的 FormsAuthentication.SetCookie 语句,改为创建一个包含 FormsIdentity 的 GenericPrincipal,然后我添加了几个自定义声明,然后我使用 SessionAuthenticationModule 编写了一个 sessionsecuritytokentocookie。我对 FederatedAuthentication 有点困惑 - 我正在使用 FederatedAuthentication.SessionAuthenticationModule 来编写令牌,但我认为这与在我的情况下仅使用 Modules("SessionAuthenticationModule") 相同吗?

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

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

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

4

2 回答 2

1

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

可能的陷阱:

  • 确保在创建 ClaimsIdentity 时设置身份验证类型 - 否则客户端将无法通过身份验证
  • 默认情况下,会话 cookie 需要 SSL(浏览器不会通过纯文本重新发送 cookie)。这可以更改,但不推荐。
于 2013-03-15T17:56:29.527 回答
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;
    }
于 2013-03-15T13:42:04.077 回答