在子域中創建一個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」,因爲任何攔截人員都能夠獲得對該帳戶的控制。
很抱歉修改了我的答案,.NET有一個隱藏功能,它將自動從表單發佈或查詢字符串中獲取認證cookie。我剛剛學到了一些新東西! – TheCodeKing
很好的回答!所以我有點顛覆了'沒有cookies'認證的功能。重新安全危害:我沒有使用RedirectFromLoginPage,因此我控制了用戶重定向到的位置。通過SSL重定向 - POST/querystring上的標記不會比formsauth cookie受到保護,最安全的方法是將整個網站通過SSL。 – russau
順便說一句 - 爲什麼社區維基?當我頒獎時你還能得到賞金嗎? – russau