2015-10-08 7 views
2

Так вот ломаются моего вопроса ступенчато:Как ссылаться на HttpContext.Current.User после Application_PostAuthenticateRequest в MVC?

  1. пользователь входит в систему с помощью Google.
  2. На входе в систему обратного вызова, информация о пользователе собирается
  3. Роли назначаются на основе пользователя создается
  4. FormsAuthenticationTicket который передает пользователю/роли в Application_PostAuthenticateRequest в Global.asax
  5. В этом запросе GenericPrinciple создается из билета проверки подлинности и ролей
  6. HttpContext.Current.User устанавливается переменной, приведенной выше

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

Ответный

public async Task<ActionResult> ExternalLoginCallback(string returnUrl) 
{ 
... 
// Get roles for current user 
string roles = "bob,adminbob,cthulu"; 

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
    1, 
    loginInfo.Email, 
    DateTime.Now, 
    DateTime.Now.AddMinutes(30), // value of time out property 
    false, 
    roles, 
    FormsAuthentication.FormsCookiePath); 

HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket)); 
Response.Cookies.Add(authCookie); 
... 
} 

Сообщение Аутентифицировать в Global.asax

protected void Application_PostAuthenticateRequest(Object sender, EventArgs e) { 
    HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName]; 

    if (authCookie != null) { 
     FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
     string[] userRoles = authTicket.UserData.Split(new Char[] { ',' }); 
     GenericPrincipal userPrincipal = new GenericPrincipal(new GenericIdentity(authTicket.Name), userRoles); 
     HttpContext.Current.User = userPrincipal; //How do I reference this in the program? 
    } 
} 
+1

Если это тот же запрос, то печенье в Ответе. Однако он еще не вернулся, но это не в запросе, но вы пытаетесь его прочитать. –

ответ

1

Nevermind Я понял, почему он возвращался пустым. Когда я вызывал метод для проверки имени, идентификатор еще не прошел проверку подлинности. Если вы попытаетесь получить имя без проверки подлинности, оно будет пустым.

Так что я просто проверил с:

HttpContext.Current.User.Identity.IsAuthenticated