2014-02-11 1 views
1

На моей странице входа FormsAuthenticationTicket настроен как постоянный файл cookie с некоторыми пользовательскими данными. Теперь мне нужно изменить эти пользовательские данные, поэтому он содержит еще один параметр. Когда предыдущий пользователь посетит сайт в следующий раз, я десериализую эту пользовательскую учетную запись в Application_PostAuthenticateRequest, но теперь я не буду добавлять вновь добавленный параметр.Renew FormsAuthenticationTicket UserData

Могу ли я получить этот параметр без необходимости повторного входа в систему?

А если нет, как сообщить постоянному файлу cookie, что он должен быть «обновлен»?

Cookie set. userId - новый параметр:

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 для предыдущего зарегистрированных пользователей:

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; 
} 

ответ

1

вы используете веб-форм или MVC?

Похоже, что вы правильно настроили свой HttpContext.Current.User правильно. Проблема может заключаться в том, что по умолчанию ваши контроллеры/представления по-прежнему считают его IPrincipal, а не ваш пользовательский принцип, поэтому вы не можете получить доступ к новым данным, которые вы установили.

Вы можете использовать его или установить в базовом контроллере, как показано ниже.

// 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; } 
    } 
} 
+0

Это MVC. Он получает правильный пользовательский принцип, но поскольку он просто десериализует некоторые данные, сохраненные в файле cookie, новый добавленный тип не задается в сериализации ... Так что либо пользователь должен войти в систему еще раз, либо я хотел бы знать, как Обновить. – perene

+0

Вы проверили, что новый UserId был правильно настроен и правильно сериализован в UserData, прежде чем шифровать его. –

+0

... Пользователь UserId НЕ установлен - вот и вся проблема. Чтобы он был установлен, пользователю необходимо снова выйти и войти в систему и создать новый файл cookie, и я ищу способ не делать этого. – perene