首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >续订FormsAuthenticationTicket UserData

续订FormsAuthenticationTicket UserData
EN

Stack Overflow用户
提问于 2014-02-11 15:54:04
回答 1查看 834关注 0票数 2

在我的登录页面上,FormsAuthenticationTicket被设置为具有一些自定义用户数据的持久性cookie。现在,我需要更改此自定义用户数据,因此它包含另一个参数。当以前登录的用户下次访问该站点时,我在Application_PostAuthenticateRequest中反序列化了这个自定义用户数据,但现在我将不再包含新添加的参数。

在不要求用户再次登录的情况下,我可以检索此参数吗?

如果不是,如何告诉持久cookie它需要“更新”?

Cookie设置。userId是一个新参数:

代码语言:javascript
复制
CustomPrincipalSerializeModel serializeModel = new CustomPrincipalSerializeModel();
serializeModel.FirstName = model.UserName;
serializeModel.userId = model.userId;

JavaScriptSerializer serializer = new JavaScriptSerializer();

string userData = serializer.Serialize(serializeModel);

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
        1,
        model.UserName,
        DateTime.Now,
        DateTime.Now.AddYears(5),
        model.RememberMe,
        userData);

string encTicket = FormsAuthentication.Encrypt(authTicket);
HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);

faCookie.Expires = authTicket.Expiration;
Response.Cookies.Add(faCookie);

return RedirectToAction("Index", "Home");

Cookie检索。Userid是新参数,对于以前登录的用户为null

代码语言:javascript
复制
HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];

if (authCookie != null)
{
    FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);

    JavaScriptSerializer serializer = new JavaScriptSerializer();

    CustomPrincipalSerializeModel serializeModel = serializer.Deserialize<CustomPrincipalSerializeModel>(authTicket.UserData);

    CustomPrincipal newUser = new CustomPrincipal(authTicket.Name);
    newUser.FirstName = serializeModel.FirstName;
    newUser.userId = serializeModel.userId;

    HttpContext.Current.User = newUser;
}
EN

回答 1

Stack Overflow用户

发布于 2014-02-11 16:09:55

您使用的是web表单还是MVC?

看起来您的HttpContext.Current.User设置是正确的。问题可能是,默认情况下,您的控制器/视图仍然认为它是它的IPrincipal,而不是您的自定义主体,因此您无法访问您设置的新数据。

您可以强制转换它,或者在如下所示的基础控制器中设置它。

代码语言:javascript
复制
// in some controller action
var firstName  = ((CustomPrincipal)User).FirstName


[Authorize]
public class BaseController : Controller
{
    protected virtual new CustomPrincipal User
    {
        get { return HttpContext.User as CustomPrincipal; }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21696092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档