2011-08-22 96 views
8

這裏有一個ASP.NET FormsAuthentication的一個有趣的功能在這個SO解釋回答:How do you pass an authenticated session between app domainsEnableCrossAppRedirects - 記錄跨域功能的位置?

快速總結;您可以使用相同的加密密鑰創建兩個ASP.NET網站。 WebsiteA可以創建一個formauth標記,並使用查詢字符串(或POST主體)中的標記重定向到WebsiteB。打開WebsiteB中的EnableCrossAppRedirects,ASP.NET檢測到令牌並創建formsauth cookie。在代碼:

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); 

聽起來像一個很棒的功能,但它在哪裏記錄?我感覺不安使用未記錄的功能。

我看過的地方 - 在任何MSDN參考資料中都沒有提及此功能。我想也許RedirectFromLoginPage會建立一個像我上面的代碼重定向,它不。

回答

14

在子域中創建一個cookie,沒有說完看着反射存在的形式一個(有點無證)功能驗證。當啓用EnableCrossAppRedirects時,除了查找auth cookie之外,.NET還會嘗試從表單發佈或查詢字符串中提取表單驗證「cookie」。此代碼嵌入ExtractTicketFromCookie方法中的FormsAuthentication類中,在該方法中可以清楚地看到嘗試在請求數據中查找身份驗證Cookie。

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; 
      } 
     } 
    } 
} 

因此,如果您在這兩個應用程序啓用EnableCrossAppRedirects,那麼第一個應用程序被授權重定向到外部網站,第二個應用程序將在從請求身份驗證Cookie自動讀取。您只需要設計它,以便返回登錄URL發佈cookie數據或將其發送到查詢字符串中。您還需要確保機器密鑰已同步,或者使用外部應用程序機器密鑰(通過第一個應用程序)對Cookie進行了加密。在默認情況下,.NET似乎會在查詢字符串中爲您發送加密的身份驗證Cookie,並假定您的計算機密鑰同步(請參閱下面的MSDN引用)。

這裏有一些更多info on MSDN

如果CookiesSupported屬性爲true,要不就是RETURNURL 變量是當前應用程序內或 EnableCrossAppRedirects屬性爲true,那麼 RedirectFromLoginPage方法發出認證憑證,並使用 其放置在默認的Cookie SetAuthCookie方法。

如果Cookies支持爲false,並且重定向路徑指向 當前應用程序中的URL,則該票證將作爲重定向URL的一部分發布。 如果CookiesSupported是假的,EnableCrossAppRedirects是真實的,而 重定向URL不會將當前應用程序中是指一個頁面, 的RedirectFromLoginPage方法發出認證憑證和 其放置在QueryString屬性

對安全性的影響有很大的警告。 EnableCrossAppRedirects是一種安全設置,可防止ASP.NET登錄控件重定向到外部返回URL(另一個Web應用程序)。啓用此設置後,它可以在某些形式的攻擊中被利用 - 用戶被髮送到官方登錄頁面,但在登錄時被重定向到他們可能認爲是相同的不同應用程序。這就是爲什麼它默認是禁用的。

的一種方式,以幫助減輕這種啓用該功能是當如下:

要在使用跨應用重定向提高安全性,您應該 覆蓋RedirectFromLoginPage方法,以允許重定向只 批准的網站。

您還需要確保通過SSL提供重定向請求以保護傳輸中的「cookie」,因爲任何攔截人員都能夠獲得對該帳戶的控制。

+0

很抱歉修改了我的答案,.NET有一個隱藏功能,它將自動從表單發佈或查詢字符串中獲取認證cookie。我剛剛學到了一些新東西! – TheCodeKing

+0

很好的回答!所以我有點顛覆了'沒有cookies'認證的功能。重新安全危害:我沒有使用RedirectFromLoginPage,因此我控制了用戶重定向到的位置。通過SSL重定向 - POST/querystring上的標記不會比formsauth cookie受到保護,最安全的方法是將整個網站通過SSL。 – russau

+0

順便說一句 - 爲什麼社區維基?當我頒獎時你還能得到賞金嗎? – russau