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认证元素

enablecrosssappredirects -跨域特性文档在哪里

看了反射器之后,有一个表单身份验证的特性(有些未记录)。当启用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",因为任何拦截者都可以获得对帐户的控制。