C# ASP.NET FormsAuthenticationModule默认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

我有一个成熟的ASP.NET web应用程序,使用FormsAuthentication(FA)管理登录。在某些情况下,我希望将“刚刚登录”的用户重定向到FA使用的另一个URL。根据标准功能,FA将重定向到我们的正常主页(在web.config中指定),除非在访问需要经过身份验证的用户的页面时使用了重定向URL

在我的系统中,在验证用户的用户名/密码后,我通常使用

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