2011-08-22 28 views
8

Đây là một tính năng thú vị của ASP.NET FormsAuthentication được giải thích trong câu trả lời SO này: How do you pass an authenticated session between app domainsEnableCrossAppRedirects - Tính năng tên miền chéo được ghi lại ở đâu?

Tóm tắt nhanh; bạn có thể tạo hai trang web ASP.NET với cùng một khóa mã hóa. WebsiteA có thể tạo mã thông báo formsauth và chuyển hướng đến WebsiteB bằng mã thông báo trong chuỗi truy vấn (hoặc nội dung POST). Bật EnableCrossAppRedirects trong WebsiteB và ASP.NET phát hiện mã thông báo và tạo cookie formsauth. Trong mã:

FormsAuthentication.RedirectFromLoginPage("alice", true); 
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket("Alice", true, 30); 
string encrypted = FormsAuthentication.Encrypt(ticket); 
Response.Redirect("http://siteb.dev/Secure/WebForm1.aspx?" + FormsAuthentication.FormsCookieName + "=" + encrypted); 

Âm thanh như một tính năng tuyệt vời, nhưng nó được ghi lại ở đâu? Tôi cảm thấy một số bit không thoải mái bằng cách sử dụng tính năng không có giấy tờ.

Nơi tôi đã xem - không đề cập đến tính năng này trong bất kỳ tham chiếu MSDN nào. Tôi nghĩ rằng có lẽ RedirectFromLoginPage sẽ xây dựng một chuyển hướng như mã của tôi ở trên, nó không.

  • EnableCrossAppRedirects - "được chọn trong phương pháp RedirectFromLoginPage khi URL chuyển hướng không trỏ đến một trang trong ứng dụng hiện tại Nếu EnableCrossAppRedirects là đúng, sau đó chuyển hướng được thực hiện."
  • Forms Authentication Across Applications - một số lời khuyên về thiết các phím máy để một cookie được tạo ra trên một tên miền phụ, không có gì về EnableCrossAppRedirects
  • forms Element for authentication

Trả lời

14

Sau khi nhìn phản xạ có một (hơi không có giấy tờ) tính năng của các hình thức Xác thực. Khi EnableCrossAppRedirects được bật. NET sẽ, ngoài việc tìm kiếm cookie xác thực, hãy thử trích xuất biểu mẫu xác thực "cookie" từ bài đăng biểu mẫu hoặc chuỗi truy vấn. Mã này được nhúng trong lớp FormsAuthentication trong phương thức ExtractTicketFromCookie, nơi có thể thấy rõ ràng là tìm cách xác thực cookie trong dữ liệu yêu cầu.

if (FormsAuthentication.EnableCrossAppRedirects) 
{ 
    text = context.Request.QueryString[name]; 
    if (text != null && text.Length > 1) 
    { 
     if (!cookielessTicket && FormsAuthentication.CookieMode == HttpCookieMode.AutoDetect) 
     { 
      cookielessTicket = CookielessHelperClass.UseCookieless(context, true, FormsAuthentication.CookieMode); 
     } 
     try 
     { 
      formsAuthenticationTicket = FormsAuthentication.Decrypt(text); 
     } 
     catch 
     { 
      flag2 = true; 
     } 
     if (formsAuthenticationTicket == null) 
     { 
      flag2 = true; 
     } 
    } 
    if (formsAuthenticationTicket == null || formsAuthenticationTicket.Expired) 
    { 
     text = context.Request.Form[name]; 
     if (text != null && text.Length > 1) 
     { 
      if (!cookielessTicket && FormsAuthentication.CookieMode == HttpCookieMode.AutoDetect) 
      { 
       cookielessTicket = CookielessHelperClass.UseCookieless(context, true, FormsAuthentication.CookieMode); 
      } 
      try 
      { 
       formsAuthenticationTicket = FormsAuthentication.Decrypt(text); 
      } 
      catch 
      { 
       flag2 = true; 
      } 
      if (formsAuthenticationTicket == null) 
      { 
       flag2 = true; 
      } 
     } 
    } 
} 

Do đó, nếu bạn kích hoạt EnableCrossAppRedirects trên cả hai ứng dụng, sau đó ứng dụng đầu tiên được ủy quyền để chuyển hướng đến các trang web bên ngoài, và các ứng dụng thứ hai sẽ tự động đọc trong cookie xác thực từ yêu cầu. Bạn chỉ cần thiết kế nó để URL đăng nhập trở lại hoặc đăng dữ liệu cookie hoặc gửi nó trong chuỗi truy vấn. Bạn cũng cần đảm bảo rằng các phím máy được đồng bộ hóa hoặc cookie được mã hóa bằng phím máy ứng dụng bên ngoài (do ứng dụng đầu tiên). Có vẻ như mặc định .NET sẽ gửi cookie xác thực được mã hóa trong chuỗi truy vấn cho bạn và khi các phím máy của bạn được đồng bộ hóa (xem báo MSDN bên dưới).

Dưới đây là một số chi tiết info on MSDN.

Nếu tài sản CookiesSupported là đúng, và một trong hai biến ReturnUrl là trong ứng dụng hiện tại hoặc EnableCrossAppRedirects tài sản là đúng, thì phương pháp RedirectFromLoginPage phát hành vé xác thực và nơi nó trong cookie mặc định sử dụng phương thức SetAuthCookie.

Nếu CookiesHỗ trợ sai và đường dẫn chuyển hướng đến URL trong ứng dụng hiện tại , vé được phát hành như một phần của URL chuyển hướng. Nếu CookiesSupported là sai, EnableCrossAppRedirects là đúng, và URL chuyển hướng không đề cập đến một trang trong ứng dụng hiện tại, phương pháp RedirectFromLoginPage phát hành vé xác thực và đặt nó vào thuộc tính QueryString.

Có một cảnh báo lớn về tác động đến bảo mật. EnableCrossAppRedirects là một thiết lập bảo mật ngăn chặn các điều khiển đăng nhập ASP.NET chuyển hướng đến một URL trả về bên ngoài (một ứng dụng web khác). Với cài đặt này, nó có thể được khai thác trong một số dạng tấn công - người dùng được gửi đến trang đăng nhập chính thức, nhưng khi đăng nhập được chuyển hướng đến một ứng dụng khác mà họ có thể tin là như nhau. Đây là lý do tại sao nó bị tắt theo mặc định.

Một cách để giúp giảm nhẹ này khi kích hoạt tính năng như sau:

Để tăng cường bảo mật khi sử dụng cross-ứng dụng chuyển hướng, bạn nên ghi đè lên các phương pháp RedirectFromLoginPage để cho phép chuyển hướng chỉ để trang web đã được phê duyệt .

Bạn cũng cần đảm bảo yêu cầu chuyển hướng được phân phối qua SSL để bảo vệ "cookie" khi chuyển tiếp, vì bất kỳ ai chặn sẽ có thể giành quyền kiểm soát tài khoản.

+0

Xin lỗi đã sửa đổi câu trả lời của tôi, có một tính năng ẩn của .NET sẽ tự động nhận biểu mẫu cookie xác thực dạng bài đăng hoặc chuỗi truy vấn. Tôi mới học được điều gì đó mới mẻ! – TheCodeKing

+0

Câu trả lời hay! Vì vậy, tôi sắp sửa lật đổ tính năng 'không có cookie' auth. Tái bảo mật mối nguy hiểm: Tôi không sử dụng RedirectFromLoginPage, vì vậy tôi kiểm soát nơi người dùng được chuyển hướng đến. Chuyển hướng qua SSL - mã thông báo trên chuỗi POST/truy vấn không được bảo vệ ít hơn cookie formsauth, đặt cược an toàn nhất là đặt toàn bộ trang web qua SSL. – russau

+0

BTW - tại sao cộng đồng wiki? bạn sẽ vẫn nhận được tiền thưởng khi tôi trao nó? – russau

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