2014-12-30 2 views
0

Я предполагаю, что проблема, которую я описываю, очень распространена, но я не могу найти решение, которое мне поможет. Я создал проект ASP.NET MVC, но вместо встроенной системы аутентификации я хотел бы создать свою собственную, поскольку у меня уже есть база данных, содержащая информацию о пользователях (имя пользователя, адрес электронной почты, пароль и т. Д.)Как установить Request.IsAuthenticated to true, когда я использую файлы cookie

Я хотел бы использовать FormsAuthentication и подключить его к моей собственной базе данных, которую, как я полагаю, уже сделал, но каждый раз, когда я отправляю новый запрос в приложение, свойство Request.IsAuthenticated всегда устанавливается как ложное.

Вот код, я использую:

// GET: /Account/Login 
    [AllowAnonymous] 
    public ActionResult Login(string returnUrl) 
    { 
     ViewBag.ReturnUrl = returnUrl; 
     return View(); 
    } 

    // 
    // POST: /Account/Login 
    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult Login(LoginViewModel model, string returnUrl) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     } 
     using (var db = new dbEntities()) 
     { 
      var result = db.Person.Any(x => x.Email == model.Email && x.Password == model.Password); 
      switch (result) 
      { 
       case true: 
        FormsAuthentication.SetAuthCookie(model.Email, true); 
        resetRequest(); 
        return RedirectToLocal(returnUrl); 
       default: 
        ModelState.AddModelError("", "Invalid login attempt."); 
        return View(model); 
      } 
     } 
    } 

    private void resetRequest() 
    { 
     var authCookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 
     if (authCookie != null) 
     { 
      FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
      if (authTicket != null && !authTicket.Expired) 
      { 
       var roles = authTicket.UserData.Split(','); 
       System.Web.HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(authTicket), roles); 
      } 
     } 
    } 

И это работает очень хорошо, прежде, чем метод resetRequest() называется значение IsAuthenticated устанавливается как ложь, после того, как он называется он установлен как истинный. Проблема в том, что когда я перенаправляюсь на главную страницу с помощью возвращаемого RedirectToLocal (returnUrl), свойство снова ложно, и я не знаю, что делать, чтобы он был установлен как истинный.

Должен ли я вызвать метод типа resetRequest() в начале каждого метода в моем контроллере? Я не думаю, что это изящное решение. Может ли кто-нибудь помочь мне в этом?

ответ

2

решаемые путем добавления следующего метода Global.asax:

protected void Application_PostAuthenticateRequest(Object sender, EventArgs e) 
    { 
     var authCookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 
     if (authCookie != null) 
     { 
      FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
      if (authTicket != null && !authTicket.Expired) 
      { 
       var roles = authTicket.UserData.Split(','); 
       System.Web.HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(authTicket), roles); 
      } 
     } 
    } 

еще не самый лучший подход, я полагаю ...

0

Настройка аутентификации печенье должно быть достаточно, у вас есть набор режимов аутентификации к формам в web.config?

+0

Да у меня есть, и это не помогло. Мне удалось решить это с помощью кода, о котором я упоминал ранее. Спасибо. – avi

0

я думаю, вы должны добавить некоторые конфигурации в web.conf

<system.web> 
    ............ 
    ...... 
    <authentication mode="Forms"> 
     <forms loginUrl="~/Login/UserLogin" timeout="2880" /> 
    </authentication> 
</system.web> 
Смежные вопросы