0

我正在创建一个自定义ClaimsPrincipal ,它使用自定义AuthenticationManager具有附加声明。似乎在 ASP.NET 4.5 中AuthenticationManager不会自动调用,您必须手动调用它。我在PostAuthenticateRequest中看到了建议您执行此操作的帖子。我的代码在 Global.asax 中如下所示:

protected void Application_OnPostAuthenticateRequest(object sender, EventArgs e)
{
    System.Web.HttpContext.Current.User =
        FederatedAuthentication.FederationConfiguration.IdentityConfiguration.ClaimsAuthenticationManager.Authenticate("none",
            System.Web.HttpContext.Current.User as ClaimsPrincipal);
}

我正在使用带有 cookie 的表单身份验证。当 PostAuthenticateRequest 被触发时,当前主体被正确设置。问题是当下一个请求进入 ASP.NET Web API 时,自定义声明会丢失。我在单页应用程序 (SPA) 中使用 Web API 处理 AJAX 请求。我怀疑当前 ClaimsPrincipal 中的内容被 cookie 中的内容覆盖,但我不确定。我没有使用继承的 ClaimsPrincipal 来对自定义声明进行类型安全的检索。我只是在添加新的声明,这些声明随后在过程中的某个地方丢失了。设置自定义 ClaimsPrincipal 的正确方法是什么,以便额外的索赔不会在请求之间丢失。

4

1 回答 1

1

这是我想出的解决方案。首先,我使用了 FormsAuthentication_OnAuthenticate 事件而不是 Application_OnPostAuthenticateRequest 事件。我获取 cookie 以检索经过身份验证的用户名,并使用我要添加的声明构建一个新的声明主体。我没有将角色添加为声明,因为系统稍后会在身份验证过程中添加它们并最终复制它们。这允许我向主体添加自定义声明,以便将来在应用程序中进行处理。

public void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs args)
{
    if (FormsAuthentication.CookiesSupported)
    {
        if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
        {
            try
            {
                FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(
                  Request.Cookies[FormsAuthentication.FormsCookieName].Value);

                SaClaimsSecurity security = new SaClaimsSecurity();
                //Do not add roles here because the security framework adds them
               //somewhere else in the chain and will duplicate roles
               ClaimsPrincipal principal = security.CreateClaimsPrincipalWithoutRoles(ticket.Name);
                args.User = principal;
            }
            catch (Exception e)
            {
                // Decrypt method failed.
            }
        }
    }
    else
    {
       throw new HttpException("Cookieless Forms Authentication is not " +
                                    "supported for this application.");
    }
}
于 2012-10-23T13:16:28.457 回答