保存联合cookie问题的自定义信息

时间:2013-04-07 10:01:13

标签: c# asp.net-mvc-4 acs

您好我在MVC4应用程序中使用acs联合进行表单身份验证。在登录期间,我的应用程序完美地通过gmail等在SSO之后进行身份验证和重定向到主页。我想保存其电子邮件ID与数据库记录的电子邮件匹配的用户的代理ID。但问题是,经过一段时间后代理ID自动删除并声明在我尝试通过此代码从其他页面访问代理ID的过程中,我添加了AgentID并将其显示为null。

((ClaimsIdentity)HttpContext.Current.User.Identity).Claims.Where(c => c.Type.Equals(ClaimTypes.Role)).FirstOrDefault();
输入gmail凭据后用户重定向时,

登录方法如下所示。

     [HttpPost]
    [ValidateInput(false)]
    [AllowAnonymous]
    public ActionResult SignIn()
    {
        UserRoles userObj=null;
        Customer customerObj=null;
        ClaimsIdentity identity = User.Identity as ClaimsIdentity;

        var claimCollection = identity.Claims;
        Dictionary<string, string> tempClaims = new Dictionary<string, string>();

        foreach (Claim claim in claimCollection)
        {
            tempClaims.Add(claim.Type, claim.Value);
        }

        if (tempClaims["http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider"] != null)
        {
            string strIdentifier = string.Empty;


            if (tempClaims["http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider"] == "uri:WindowsLiveID")
                strIdentifier = tempClaims["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"];
            else
                strIdentifier = tempClaims["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"];


            userObj = repository.Filter(f => f.EmailId.Equals(strIdentifier)).FirstOrDefault();


            if (userObj != null)
            {
                identity.AddClaim(new Claim(ClaimTypes.Role, userObj.Role));


                identity.AddClaim(new Claim(ClaimTypes.SerialNumber, userObj.AgentID.ToString()));




            }                

        }           


        return User.Identity.IsAuthenticated ? RedirectToAction("Index", "Home") : RedirectToAction("Login");

    }

2 个答案:

答案 0 :(得分:2)

您似乎已将AgentID添加为ClaimTypes.SerialNumber声明,但您尚未将新主体持久保存到联合Cookie中:

var principal = new ClaimsPrincipal(identity);
var token = new SessionSecurityToken(principal);
FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(token);

WriteSessionTokenToCookie将使用您添加的自定义声明更新联盟Cookie,以便在后续请求中您可以检索它们。

答案 1 :(得分:0)

您似乎正在增加内存中的声明集,但您不会再次在Cookie中保留。

有两个选项 - 要么手动保留新的声明标识,要么只是忘记显示代码,或者不要将更改保存到联合cookie(这解释了为什么您的更改会丢失)。

看看我的一个教程,其中我展示了如何从头开始创建声明标识并坚持下去。我希望这能为您提供有关如何处理增强身份的一些想法:

http://netpl.blogspot.com/2012/09/forms-authentication-revisited.html