2015-10-16 12 views
12

Chúng tôi có một ứng dụng ASP.NET MVC 5 đã sử dụng Xác thực Mẫu với thời gian hết hạn trượt. Gần đây, chúng tôi đã chuyển sang OWIN Cookie Authentication và đang gặp sự cố với các phiên của chúng tôi không mở rộng đúng cách.Tại sao các yêu cầu AJAX của tôi không mở rộng phiên OWIN MVC?

Trước đây, phiên có thể được mở rộng từ yêu cầu AJAX xhr. Tuy nhiên, với cấu hình này, chúng không mở rộng. Tôi nhận được 200 cho mỗi yêu cầu (cả GET và POST) cần được mở rộng, ngay cả sau khi máy chủ đã giết phiên.

Các thiết lập hiện tại là:

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext); 
app.UseCookieAuthentication(new CookieAuthenticationOptions() 
{ 
    AuthenticationType = "Cookies", 
    CookieSecure = CookieSecureOption.SameAsRequest, 
    CookieName = Constants.CatalystPortalCookieName, 
    LoginPath = new PathString(url.Action(nameof(LoginController.Index), "Login")), 
    SlidingExpiration = true, 
    ExpireTimeSpan = TimeSpan.FromMinutes(20), 
    CookiePath = "/", 
}); 

Nếu tôi nhấp một liên kết mà làm cho toàn bộ trang được nạp như một phản ứng tài liệu, tuy nhiên, máy chủ đúng cách mở rộng phiên.

+1

bạn đang sử dụng * Session.Abandon * giết phiên/đăng xuất? nếu vậy không đúng với OWIN. Với OWIN, bạn nên sử dụng phương pháp AuthenticationManager.SignOut –

+1

Nếu bạn nhìn vào các tiêu đề phản hồi, bạn có thấy những thứ như bộ nhớ cache không? Nếu bạn có thể gặp phải vấn đề xung đột về cookie: http://katanaproject.codeplex.com/wikipage?title=System.Web%20response%20cookie%20integration%20issues – Tratcher

+1

Nó có thể đáng để mở [fiddler] (http://www.telerik.com/fiddler) và kiểm tra các yêu cầu/phản hồi. –

Trả lời

0

Tôi đã kết thúc có một số giả định bị lỗi. Yêu cầu AJAX được mở rộng. Sự trở lại của 200 đã ném tôi đi. Sau khi tìm kiếm với cáy tại đáp ứng thực tế, tôi thấy rằng với sự thay đổi để OWIN, 401 thực sự là di chuyển theo phản ứng:

X-Responded-JSON: {"status":401,"headers":{...foo...}} 

Vì vậy, chúng tôi đã kết thúc chỉ thiết lập trạng thái của phản ứng trở lại 401. Đó có lẽ là khủng khiếp, nhưng nó phù hợp với nhu cầu của chúng tôi.

protected void Application_EndRequest() { 
    var context = new HttpContextWrapper(Context); 
    var header = context.Response.Headers["X-Responded-JSON"]; 
    if (header != null && header.Contains("\"status\":401")) { 
     Context.Response.Clear(); 
     Context.Response.StatusCode = 401; 
    } 

Đây có thể là một giải pháp mạnh mẽ hơn: OWIN: unauthorised webapi call returning login page rather than 401

Các vấn đề liên quan