enablecrosssappredirects -跨域特性文档在哪里
本文关键字:文档 在哪里 enablecrosssappredirects | 更新日期: 2023-09-27 18:06:18
这里有一个ASP的有趣特性。NET FormsAuthentication在这个SO答案中解释:如何在应用程序域之间传递经过身份验证的会话
快速总结;您可以创建两个ASP。. NET网站使用相同的加密密钥。websita可以创建一个表单令牌,并在查询字符串(或POST主体)中使用令牌重定向到websitb。在websitb和ASP中打开enablecrosssappredirects。NET检测令牌并创建formsath 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会像我上面的代码一样建立一个重定向,它没有。
- 当重定向URL没有指向当前应用程序中的页面时,在RedirectFromLoginPage方法中检查
- enablecrosssappredirects - "。如果enablecrosssappredirects为true,则执行重定向" "。
- 跨应用程序的表单认证-关于设置机器密钥以便在子域上创建cookie的一些建议,没有关于enablecrosssappredirects
- forms认证元素
看了反射器之后,有一个表单身份验证的特性(有些未记录)。当启用EnableCrossAppRedirects
时,. net除了查找验证cookie外,还将尝试从表单post或查询字符串中提取表单认证"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数据,要么在querystring中发送它。你还需要确保机器密钥是同步的,或者cookie是使用外部应用程序的机器密钥加密的(由第一个应用程序)。似乎默认情况下。net将在querystring中为您发送加密的身份验证cookie,并假设您的机器密钥是同步的(参见下面的MSDN引用)。
MSDN上的更多信息
如果CookiesSupported属性为true,则ReturnUrl变量在当前应用程序或enablecrosssappredirects属性为真,则RedirectFromLoginPage方法发出一个身份验证票据,并且使用SetAuthCookie方法将其放置在默认cookie中。
如果CookiesSupported为false且重定向路径是指向在当前应用程序中,票据作为重定向URL的一部分发出。如果CookiesSupported为false,则enablecrosssappredirects为true,并且重定向URL不指向当前应用程序中的页面,RedirectFromLoginPage方法发出一个身份验证票据,并且将其放置在QueryString属性中。
有一个关于安全影响的大警告。EnableCrossAppRedirects
是一个安全设置,可以防止ASP。. NET登录控件从重定向到外部返回URL(另一个web应用程序)。启用此设置后,它可以在某些形式的攻击中被利用-用户被发送到官方登录页面,但在登录时被重定向到他们可能认为是相同的不同应用程序。这就是为什么它在默认情况下是禁用的。
在启用该特性时,帮助缓解此问题的一种方法如下:
要提高使用跨应用程序重定向时的安全性,您应该重写RedirectFromLoginPage方法,只允许重定向到批准的网站
您还需要确保重定向请求是通过SSL提供的,以保护传输中的"cookie",因为任何拦截者都可以获得对帐户的控制。