我有一个成熟的ASP.NET Web应用程序,使用FormsAuthentication(FA)来管理登录。在某些情况下,我想重定向"刚刚登录"用户使用与FA使用的URL不同的URL。根据标准功能,FA将重定向到我们的普通主页(在web.config中指定),除非在遇到需要经过身份验证的用户的页面时使用了redirectUrl。
在我的系统中,在验证用户的用户名/密码后,我通常使用
FormsAuthentication.RedirectFromLoginPage(userName, createPersistentCookie: true); // Also calls SetAuthCookie()
处理大多数情况。但是,根据某些条件(主要基于新登录的用户的角色),我想重定向到不同的目的地。我这样做的想法是自己致电SetAuthCookie()
,然后使用Response.Redirect(myUrl, false);
和ApplicationInstance.CompleteRequest()
。
尽管如此,下一个请求还是用于我的web.config标记中定义的URL。
<authentication mode="Forms">
<forms loginUrl="~/Login" timeout="120" cookieless="UseCookies" defaultUrl="~/?raspberry=true" />
</authentication>
以下是我正在使用的实际代码(如果需要不同的网址,则由overrideUrl
参数指定:
internal static void CreateTicket(string userName, string overrideUrl)
{
// Ref: http://support.microsoft.com/kb/301240
if (overrideUrl == null)
{
FormsAuthentication.RedirectFromLoginPage(userName, createPersistentCookie: true); // Includes call to SetAuthCookie()
}
else
{
FormsAuthentication.SetAuthCookie(userName, createPersistentCookie: true, strCookiePath:FormsAuthentication.FormsCookiePath);
HttpContext.Current.Response.Redirect(overrideUrl, false);
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
}
如果我为/special/path
传入overrideUrl
的值,我希望下一个请求进入&#39; / special / path&#39;。相反,我看到/?raspberry=true
是否有其他强制使用defaultUrl? 有没有办法去&#34;窥探&#34;在调试时进入Response对象以查看Redirect是否已经到位?或者设置一个断点,这样我就可以查看调用堆栈了吗?
编辑:在我的方法结束时,Response对象显示以下属性:
RedirectLocation: "/special/path"
Status: "302 Found"
StatusCode: 302
StatusDescription: "Found"
IsRequestBeingRedirected: true
HeadersWritten: false
这看起来绝对正确。
感谢您的任何建议。
答案 0 :(得分:0)
好的,我可以看到是什么导致了它。我正在使用Login
Web控件并将我的代码作为Authenticate
事件的一部分运行。查看Login Web Control的参考来源,Authenticate
事件由AttemptLogin
方法引发(在参考源中搜索)。在提升事件并看到身份验证成功之后,它继续执行:
我将不得不找出一个解决方案,因为这些方法是私有的(不能通过继承usercontrol来覆盖),并且似乎没有选项来覆盖或抑制它的GetRedirectUrl()。< / p>