rus*_*sau 8 c# asp.net forms-authentication
这里有一个有趣的ASP.NET FormsAuthentication功能,在这个SO答案中解释:如何在app域之间传递经过身份验证的会话
快速摘要; 您可以使用相同的加密密钥创建两个ASP.NET网站.WebsiteA可以创建一个formauth令牌,并使用查询字符串(或POST正文)中的令牌重定向到WebsiteB.在WebsiteB和ASP.NET中启用EnableCrossAppRedirects会检测令牌并创建formauth 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);
Run Code Online (Sandbox Code Playgroud)
听起来像一个很棒的功能,但它在哪里记录?使用未记录的功能我会感到有些不安.
我看过的地方 - 在任何MSDN参考中都没有提到这个功能.我想也许RedirectFromLoginPage会像我上面的代码一样构建一个重定向,但事实并非如此.
The*_*ing 15
看过反射器后,表单身份验证(有点无证).当EnableCrossAppRedirects启用了.NET会,除了寻找权威性的cookie,试图提取无论从形式发布或查询字符串的窗体身份验证"曲奇".此代码嵌入在方法的FormsAuthentication类中ExtractTicketFromCookie,可以清楚地看到尝试在请求数据中查找身份验证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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果EnableCrossAppRedirects在两个应用程序上启用,则第一个应用程序被授权重定向到外部站点,第二个应用程序将自动从请求中读取身份验证cookie.您只需要对其进行设计,以便返回登录URL可以发布cookie数据或将其发送到查询字符串中.您还需要确保机器密钥已同步,或者使用外部应用程序机器密钥(第一个应用程序)加密cookie.默认情况下,.NET会在您的查询字符串中发送加密的身份验证cookie,并且您的计算机密钥是同步的(请参阅下面的MSDN引用).
如果CookiesSupported属性为true,并且ReturnUrl变量在当前应用程序中或EnableCrossAppRedirects属性为true,则RedirectFromLoginPage方法会发出身份验证票证并使用SetAuthCookie方法将其置于默认cookie中.
如果CookiesSupported为false且重定向路径为当前应用程序中的URL,则该故障单将作为重定向URL的一部分发出. 如果CookiesSupported为false,则EnableCrossAppRedirects为true,并且重定向URL不引用当前应用程序中的页面,RedirectFromLoginPage方法会发出身份验证票证并将其放在QueryString属性中.
对安全性的影响有一个很大的警告.EnableCrossAppRedirects是一种安全设置,可防止ASP.NET登录控件重定向到外部返回URL(另一个Web应用程序).启用此设置后,它可以在某些形式的攻击中被利用 - 用户被发送到官方登录页面,但登录时会被重定向到他们可能认为相同的不同应用程序.这就是它默认禁用的原因.
启用该功能时,一种有助于缓解此问题的方法如下:
要在使用跨应用程序重定向时提高安全性,应覆盖RedirectFromLoginPage方法以仅允许重定向到已批准的网站.
您还需要确保通过SSL提供重定向请求以保护传输中的"cookie",因为任何拦截都可以获得对帐户的控制权.
| 归档时间: |
|
| 查看次数: |
6492 次 |
| 最近记录: |