C# EnableCrossAppRedirects-跨域功能记录在哪里?

C# EnableCrossAppRedirects-跨域功能记录在哪里?,c#,asp.net,forms-authentication,C#,Asp.net,Forms Authentication,下面是ASP.NET FormsAuthentication的一个有趣功能,在这个SO答案中解释: 快速总结;您可以使用相同的加密密钥创建两个ASP.NET网站。WebsiteA可以创建一个formsauth令牌,并在querystring(或帖子正文)中使用该令牌重定向到WebsiteB。打开Web站点B和ASP.NET中的EnableCrossAppRedirects可检测令牌并创建formsauth cookie。代码: FormsAuthentication.RedirectFromLo

下面是ASP.NET FormsAuthentication的一个有趣功能,在这个SO答案中解释:

快速总结;您可以使用相同的加密密钥创建两个ASP.NET网站。WebsiteA可以创建一个formsauth令牌,并在querystring(或帖子正文)中使用该令牌重定向到WebsiteB。打开Web站点B和ASP.NET中的EnableCrossAppRedirects可检测令牌并创建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会像上面的代码一样构建一个重定向,但事实并非如此

  • -“当重定向URL不指向当前应用程序中的页面时,在RedirectFromLoginPage方法中选中。如果EnableCrossAppRedirects为true,则执行重定向”
  • -关于设置机器密钥的一些建议,以便在子域上创建cookie,而不是启用CrossAppRedirects

查看reflector后,表单身份验证有一个(有些未记录)功能。启用
EnableCrossAppRedirects
时,除了查找身份验证cookie外,NET还会尝试从表单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报价)

这里还有一些

如果CookiesSupported属性为true,则返回URL 变量位于当前应用程序或 EnableCrossAppRedirects属性为true,则 RedirectFromLoginPage方法发出身份验证票证并 使用SetAuthCookie方法将其放置在默认cookie中

如果CookieSupported为false,且重定向路径指向 在当前应用程序中,票证作为重定向URL的一部分发布。 如果CookiesSupported为false,则EnableCrossAppRedirects为true,并且 重定向URL不引用当前应用程序中的页面, RedirectFromLoginPage方法发出身份验证票证并 将其放置在QueryString属性中

对安全的影响有一个很大的警告
EnableCrossAppRedirects
是一种安全设置,用于防止ASP.NET登录控件重定向到外部返回URL(另一个web应用程序)。启用此设置后,它可以在某些形式的攻击中被利用-用户被发送到正式登录页面,但在登录时被重定向到他们可能认为相同的其他应用程序。这就是它在默认情况下被禁用的原因

启用该功能时有助于缓解此问题的一种方法如下:

要提高使用跨应用程序重定向时的安全性,您应该 重写RedirectFromLoginPage方法以仅允许重定向到 核准的网站


您还需要确保重定向请求通过SSL提供,以保护传输中的“cookie”,因为任何拦截的人都可以获得对帐户的控制。

对不起,我修改了答案,.NET的一个隐藏功能将自动从表单post或查询字符串中提取身份验证cookie。我刚刚学到了一些新东西!回答得好!所以我有点颠覆了“没有cookies”auth的一个特性。安全隐患:我没有使用RedirectFromLoginPage,因此我可以控制用户被重定向到的位置。通过SSL重定向-POST/querystring上的令牌的保护不亚于formsauth cookie,最安全的赌注是将整个网站置于SSL.BTW上-为什么是社区wiki?我给你奖金的时候你还会得到奖金吗?不知道为什么会这么说,也许是因为我修改了很多次?我仍然不知道该怎么做。@TheCodeKing所描述的代码已经转移到FormsAuthenticationModule。