2013-02-05 2 views
1

Я зарегистрировал информацию аутентификации внутри User.Identity.Name после входа пользователя в систему. используя this методЗначение аутентификации изменения mvc3

FormsAuthentication.SetAuthCookie(Id + " | " + Name + " | " + Language + " | " + Culture + " | " + Email + " | " + Role+ " | " + TimeOffset+ " | " + Rights, RememberMe); 

Теперь я хочу, чтобы изменить некоторые значения внутри User.Identity.Name когда пользователь изменить некоторые настройки configutation, например Language

Но после вызова FormsAuthentication.SetAuthCookie(), значение внутри User.Identity.Name не меняется больше

string identity = HttpContext.Current.User.Identity.Name; // modify current value 
FormsAuthentication.SetAuthCookie(identity, false); // assign new value 

Как я могу изменить это значение?

ответ

1

SetAuthCookie обновляет файл cookie, содержащий билет FormsAuth, с обновленным значением, но не устанавливает User текущего контекста. Вы можете изменить пользователя текущего контекста, создав новый IPrincipal и IIdentity. Это так же просто, как получить текущий HttpContext и установить User.

Обычно вы делаете это в IHttpModule или Global.asax.cs в событии PostAuthenticateRequest, потому что в этот момент FormsAuth уже проверит подлинность билета пользователя и установит личность. После этого события новый IPrincipal, который вы создали, будет доступен для приложения для остальной части запроса.

protected void Application_PostAuthenticateRequest(object sender, EventArgs args) 
{ 
    var application = (HttpApplication)sender; 
    var context = application.Context; 

    if (context.User != null || !context.User.Identity.IsAuthenticated) return; // user not authenticated, so you don't need to do anything else 

    // Here, you'd process the existing context.User.Identity.Name and split out the values you need. that part is up to you. in my example here, I'll just show you creating a new principal 
    var oldUserName = context.User.Identity.Name; 
    context.User = new GenericPrincipal(new GenericIdentity(oldUserName, "Forms"), new string[0]); 
} 

Как и в сторону, я не рекомендую упаковки значения во имя идентичности, а UserData собственность билета. В этом случае, вы можете проверить, если context.User.Identity является FormsIdentity и доступ Ticket.UserData:

protected void Application_PostAuthenticateRequest(object sender, EventArgs args) 
{ 
    var application = (HttpApplication)sender; 
    var context = application.Context; 

    if (context.User != null || !context.User.Identity.IsAuthenticated) return; // user not authenticated, so you don't need to do anything else 

    var formsIdentity = context.User.Identity as FormsIdentity; 

    if (formsIdentity == null) return; // not a forms identity, so we can't do any further processing 

    var ticket = formsIdentity.Ticket; 

    // now you can access ticket.UserData 
    // to add your own values to UserData, you'll have to create the ticket manually when you first log the user in 

    var values = ticket.UserData.Split('|'); 

    // etc. 
    // I'll pretend the second element values is a comma-delimited list of roles for the user, just to illustrate my point 
    var roles = values[1].Split(','); 


    context.User = new GenericPrincipal(new GenericIdentity(ticket.Name, "Forms"), roles); 
} 

Here еще некоторая информация о создании билетов FormsAuth с пользовательскими значениями в UserData.

Смежные вопросы