2011-07-05 46 views
5

đang đăng nhập của tôi, sau khi xác thực:IsAuthenticated hoạt động trên trình duyệt - nhưng không phải với ứng dụng khách!

var authTicket = new FormsAuthenticationTicket(
       1, 
       userName, 
       DateTime.Now, 
       DateTime.Now.AddMinutes(20), // expiry 
       false, 
       roles, 
       "/"); 
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket)); 
Response.Cookies.Add(cookie); 

và, nhờ Darin Dimitrov, tôi có một phong tục Ủy quyền cho thuộc tính:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)] 
public class TJAuthorize : AuthorizeAttribute { 
    public override void OnAuthorization(AuthorizationContext filterContext) { 
     string cookieName = FormsAuthentication.FormsCookieName; 

     if (!filterContext.HttpContext.User.Identity.IsAuthenticated || 
       filterContext.HttpContext.Request.Cookies == null || filterContext.HttpContext.Request.Cookies[cookieName] == null) { 
        HandleUnauthorizedRequest(filterContext); 
      return; 
     } 

     var authCookie = filterContext.HttpContext.Request.Cookies[cookieName]; 
     var authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
     string[] roles = authTicket.UserData.Split(','); 

     var userIdentity = new GenericIdentity(authTicket.Name); 
     var userPrincipal = new GenericPrincipal(userIdentity, roles); 

     filterContext.HttpContext.User = userPrincipal; 
     base.OnAuthorization(filterContext); 
    } 

bài này làm việc tuyệt vời khi tôi đang làm việc trong một phiên trình duyệt. Nhưng bây giờ tôi đang làm việc với một khách hàng Flash/Adobe Air và thuộc tính xác thực đang gây ra lỗi. Bằng cách đặt các câu lệnh gỡ lỗi vào mã, tôi có thể nói rằng:

filterContext.HttpContext.User.Identity.IsAuthenticated 

là sai - ngay cả sau khi đăng nhập thành công!

Tại sao nên có bất kỳ sự khác biệt nào giữa việc sử dụng ứng dụng khách của trình duyệt và ứng dụng Máy khách? Và làm cách nào để khắc phục điều này?

EDIT: đầu mối khác: sau khi đưa vào một số báo cáo debug hơn, tôi đã phát hiện ra rằng filterContext.HttpContext.User.Identity không đúng thiết lập khi thực hiện cuộc gọi từ máy bay - các Name tài sản đi ra trống! ID phiên là chính xác, ID cookie là chính xác - nhưng User.Identity không được đặt. Bất kỳ ý tưởng nào tại sao điều này có thể xảy ra?

Trả lời

4

Có lẽ HttpCookieMode (http://msdn.microsoft.com/en-us/library/system.web.httpcookiemode.aspx) được đặt thành giá trị sai?

Mặc định là UseDeviceProfile ... điều gì sẽ xảy ra khi bạn ép nó vào UseCookies?

+0

Tuyệt vời - tôi đã thêm 'cookieless =" UseCookies "' vào thẻ '' trong '', và bây giờ nó hoạt động! Bạn thiên tài, bạn! :) –

+0

Yay !! Cảm ơn G-d! ... đó là một nỗ lực của nhóm - công việc tuyệt vời Shaul! Cảm ơn @vnuk đã giúp chúng tôi suy nghĩ đúng hướng! – davidkomer

2

Đó là một ảnh dài, nhưng được xác thực phụ thuộc vào cookie ASPXAUTH của khách hàng (hoặc bất kỳ tên nào bạn đã đặt tên id) được gửi cùng với yêu cầu. Đảm bảo rằng flash/không khí đang gửi cookie đó (bằng công cụ mạng hoặc bất kỳ công cụ mạng nào khác)

+0

Đúng, ý tưởng hay, nhưng tôi đang gửi cookie ASPXAUTH, đã kiểm tra xem nó có giống với những gì đang được trả về sau khi xác thực không ... –

+0

Phải có điều gì đó khác trong yêu cầu không khí. Nắm bắt cả hai yêu cầu với Wireshark và so sánh chúng. – Vnuk

+0

Tôi đang làm việc với Shaul về điều này ... chúng tôi đang sử dụng Charles và không có sự khác biệt trong Cookies (có sự khác biệt trong các thông số khác) – davidkomer

0

Liệu HttpContext.User.Identity có hiển thị trong Application_AuthorizeRequest trong global.asax không?

+0

Hành vi tương tự như ở nơi khác - khi được gọi từ trình duyệt, có ; khi được gọi từ Air, không. –

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