2015-02-23 104 views
1

從jQuery發送ajax請求時,我知道用戶是否已通過身份驗證。FormsAuthentication和Ajax請求

HttpContext.User.Identity當用戶從其瀏覽器發出常規請求並設置了aspxauth cookie時,它不爲空。當用戶嘗試從jQuery執行ajax請求時,根本沒有設置aspxauth

我的web.config

<authentication mode="Forms"> 
    <forms loginUrl="~/" /> 
</authentication> 

設置FormsAuthentication餅乾

var cookie = new AuthCookie 
      { 
       UserId = user.UserId, 
       Email = user.Email, 
       Name = user.Name, 
       RememberMe = createPersistentCookie, 
       TimeZone = user.TimeZone, 
       CompanyId = user.CompanyId, 
       Roles = new List<string> { user.Role ?? "user" } 
      }; 

      string userData = JsonConvert.SerializeObject(cookie); 
      var ticket = new FormsAuthenticationTicket(1, cookie.Email, DateTime.Now, 
                 DateTime.Now.Add(FormsAuthentication.Timeout), 
                 createPersistentCookie, userData); 
      string encTicket = FormsAuthentication.Encrypt(ticket); 
      var httpCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket) { Expires = DateTime.Now.Add(FormsAuthentication.Timeout) }; 

      _httpContext.Response.Cookies.Add(httpCookie); 

當我通過我的broser提出請求時,會出現身份驗證的cookie: enter image description here

每當我提出一個要求通過JavaScript使用$ .get()或加載JavaScript腳本/任何其他請求通過JavaScript,我得到: enter image description here

奇怪的是,在另一個ASP應用程序中,我使用的是WebSecurity,而且完美地工作。身份驗證Cookie始終從客戶端發送回服務器。對於這個ASP MVC 5應用程序,當我嘗試使用FormAuthentication時,我無法讓AuthCookie繼續處理所有請求。

回答

0

你仍然可以使用[Authorize]等來修飾你的類/方法。如果你正在尋找檢查控制器方法裏面,你有機會獲得財產System.Web.Mvc.Controller或System.Web.Http.ApiController繼承根據控制器的味道用戶:

// 
// Summary: 
//  Returns the current principal associated with this request. 
// 
// Returns: 
//  The current principal associated with this request. 
public IPrincipal User { get; set; } 

它可以使用像這樣:

if (User != null && User.Identity != null && User.Identity.IsAuthenticated) 
{ 
    // user has access - process request 
} 

編輯:

這裏是用Ajax的[API]控制器[能夠]方法,該方法使用了控制器的用戶屬性,而不是的HttpContext的的一個例子:

public class HelloController : ApiController 
{ 
    [HttpGet] 
    public IHttpActionResult HelloWorld() 
    { 
     try 
     { 
      if (User != null && User.Identity != null && User.Identity.IsAuthenticated) 
      { 
       return Ok("Hello There " + User.Identity.Name + "!"); 
      } 
      else 
      { 
       return Ok("Hello There Anonymous!"); 
      } 
     } 
     catch { throw; } 
    } 
} 
+0

當對象來自ajax請求時未設置用戶 – 2015-02-23 20:31:50

+0

此User對象不是來自HttpContext,而是直接來自控制器。當調用任何控制器方法時,無論請求是什麼「類型」,它都會被解析。我假設你的ajax請求正在調用控制器方法正確? – pnm 2015-02-23 21:10:20

+0

目前,我正在使用名爲'CustomAuth'的Action的授權屬性ontop來檢查用戶是否爲null,然而,當我正在執行ajax請求時,它始終爲空。不要將HttpContext傳遞給我的屬性? – 2015-02-23 21:29:54