ASP.NET FormsAuthenticationModule DefaultUrl重写显式

时间:2017-02-08 17:51:06

标签: c# asp.net forms-authentication

我有一个成熟的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

这看起来绝对正确。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

好的,我可以看到是什么导致了它。我正在使用Login Web控件并将我的代码作为Authenticate事件的一部分运行。查看Login Web Control的参考来源,Authenticate事件由AttemptLogin方法引发(在参考源中搜索)。在提升事件并看到身份验证成功之后,它继续执行:

  1. 调用SetAuthCookie本身(我自己已经完成了这个,但可能我在代码中应该做的唯一事情就是确定身份验证是否成功,而不是弄乱AuthCookie或重定向)
  2. 执行重定向(覆盖我精心设计的重定向)
  3. 我将不得不找出一个解决方案,因为这些方法是私有的(不能通过继承usercontrol来覆盖),并且似乎没有选项来覆盖或抑制它的GetRedirectUrl()。< / p>