C# ASP.NET FormsAuthenticationModule默认URL重写显式
我有一个成熟的ASP.NET web应用程序,使用FormsAuthentication(FA)管理登录。在某些情况下,我希望将“刚刚登录”的用户重定向到FA使用的另一个URL。根据标准功能,FA将重定向到我们的正常主页(在web.config中指定),除非在访问需要经过身份验证的用户的页面时使用了重定向URL 在我的系统中,在验证用户的用户名/密码后,我通常使用C# ASP.NET FormsAuthenticationModule默认URL重写显式,c#,asp.net,forms-authentication,C#,Asp.net,Forms Authentication,我有一个成熟的ASP.NET web应用程序,使用FormsAuthentication(FA)管理登录。在某些情况下,我希望将“刚刚登录”的用户重定向到FA使用的另一个URL。根据标准功能,FA将重定向到我们的正常主页(在web.config中指定),除非在访问需要经过身份验证的用户的页面时使用了重定向URL 在我的系统中,在验证用户的用户名/密码后,我通常使用 FormsAuthentication.RedirectFromLoginPage(userName, createPersiste
FormsAuthentication.RedirectFromLoginPage(userName, createPersistentCookie: true); // Also calls SetAuthCookie()
它可以处理大多数情况。但是,根据特定条件(主要基于新登录用户的角色),我希望重定向到不同的目标。我的想法是调用SetAuthCookie()
imf,然后使用Response.Redirect(myUrl,false)代码>和ApplicationInstance.CompleteRequest()
尽管这样做了,下一个请求还是使用在我的web.config标记中定义的URL
<authentication mode="Forms">
<forms loginUrl="~/Login" timeout="120" cookieless="UseCookies" defaultUrl="~/?raspberry=true" />
</authentication>
如果我为overrideUrl
传入值/special/path
,我希望下一个请求是'/special/path'。相反,我看到的是/?raspberry=true
是不是有别的东西在强制使用defaultUrl?
在调试时,是否有方法“窥探”响应对象,以查看重定向是否已到位?或者在设置断点时设置断点,以便查看调用堆栈
编辑:在我的方法末尾,响应对象显示以下属性:
RedirectLocation: "/special/path"
Status: "302 Found"
StatusCode: 302
StatusDescription: "Found"
IsRequestBeingRedirected: true
HeadersWritten: false
所有这些看起来都是绝对正确的
谢谢你的建议。好的,我知道是什么引起的。事实上,我正在使用Login
Web控件,并在Authenticate
事件中运行我的代码。查看的参考源,Authenticate
事件由其AttemptLogin
方法引发(在参考源中搜索)。引发事件并看到身份验证成功后,它将继续:
调用SetAuthCookie本身(我自己已经这样做了,但我在代码中应该做的唯一一件事大概是确定身份验证是否成功,而不是干扰AuthCookie或重定向)
执行重定向(覆盖精心编制的重定向)
我将不得不找出一个解决方案,因为这些方法是私有的(不能通过继承usercontrol来覆盖),而且似乎没有选项覆盖或抑制它的GetRedirectUrl()的用户。我已经查看了模块的OnLeave()的参考源
方法,并看到它检查一个名为Response.SuppressFormsAuthenticationRedirect
)的属性。我认为将其设置为true
可以解决问题(因为我只能假设管道末端的FA模块覆盖了该值)。但是没有!将此设置为true并不能解决问题!!!我上面的代码是从我的登录页面上的用户控件中的System.Web.UI.WebControls.Login的Authenticate
事件调用的。在直接返回到该方法后,响应属性仍然正确,但是下一个“调试器步骤”将我带到另一个用户控件的呈现方法,我可以看到响应。此时重定向位置已恢复为“/?raspberry=true”
,因此有些“神奇”的东西在这两个事件之间的ASP.NET框架中,Shandler正在取消我精心设置的重定向:-(我现在不敢相信它是FormsAuthentication模块。)
RedirectLocation: "/special/path"
Status: "302 Found"
StatusCode: 302
StatusDescription: "Found"
IsRequestBeingRedirected: true
HeadersWritten: false