2011-02-02 73 views
0

我有一個網站託管在安裝了URL Rewrite module 2.0的IIS 7上。它由內容管理系統運行,查看URL並在當前用戶無權查看頁面時返回401錯誤。這被ASP.NET URL授權模塊接收,然後按照web.config文件(表單身份驗證)中指定的方式將頁面踢到loginUrl頁面。具有URL重寫模塊2.0的IIS 7 - 設置401狀態代碼和ReturnUrl

這工作完全在我的本地機器上 - 這是IIS 7和Windows 7

如果URL,比如,/612/some-string用戶獲取對/66/login?ReturnUrl=/612/some-string定向到登錄頁面。

URL重寫將查看文檔ID的URL的第一部分。真正的URL是這樣的:index.aspx?documentId=612

不幸的是,當我將它部署到我們的登臺服務器時,ReturnUrl不是重寫的URL,而是原始URL。這會導致各種問題。

登臺服務器也是安裝了URL Rewrite Module 2.0的IIS 7。它是Windows 2008服務器SP2。兩者都運行ASP.NET 3.5。

我唯一的猜測是machine.config文件以不同的方式排列默認的httpModules,.NET表單驗證模塊在URL被重寫之前跳入。

我會盡快審查,但在此期間,這個問題的經驗是什麼,它可以解決?

更新

我也試圖改變

Response.StatusCode = 401; 

FormsAuthentication.RedirectToLoginPage(); 

這讓我有點超前,但還是引導用戶回到那個已經不是網址被重寫。

我也能做到這一點,而不是設置了401:

string currentPage = HttpUtility.UrlEncode(Request.RawUrl); 
string loginUrl = FormsAuthentication.LoginUrl + "?ReturnUrl=" + currentPage; 
Response.Redirect(loginUrl); 

但這似乎難看。

+0

任何決議對此? – iambriansreed 2013-06-20 13:36:43

回答

1

在本書多米尼克·拜爾開發更多=安全的Microsoft ASP.NET 2.0應用程序的第二章有一個ShowPipeline.ashx表示採用一個HttpHandler在服務器上完成管道排序:

<%@ WebHandler Class='ShowPipeline' Language='c#' %> 

    using System; 
    using System.Web; 
    using System.Reflection; 
    using System.ComponentModel; 

    // shows which modules have registered for which event 
    // add a ?asm=true query string parameter to also show the assemblies 
    public class ShowPipeline : IHttpHandler 

    { 
     static bool _showAssemblies = false; 

     // names of the pipeline events 
    static string[] _handlerNames = { 
     "BeginRequest", 
     "AuthenticateRequest", 
     "DefaultAuthentication", 
     "PostAuthenticateRequest", 
     "AuthorizeRequest", 
     "PostAuthorizeRequest", 
     "ResolveRequestCache", 
     "PostResolveRequestCache", 
     "AcquireRequestState", 
     "PostAcquireRequestState", 
     "PreRequestHandlerExecute", 
     "PostRequestHandlerExecute", 
     "ReleaseRequestState", 
     "UpdateRequestCache", 
     "PostUpdateRequestCache", 
     "EndRequest" 
    }; 

    public void ProcessRequest(HttpContext ctx) 
    { 
     if (ctx.Request.QueryString["asm"] == "true") 
      _showAssemblies = true; 

     ctx.Response.Write("<hr>"); 

     foreach (string s in _handlerNames) 
     { 
      _showHandlers(s); 
     } 

     ctx.Response.Write("<hr>"); 
    } 

    public void _showHandlers(string handlerName) 
    { 
     HttpResponse r = HttpContext.Current.Response; 
     object key = _getPrivateAppField("Event" + handlerName); 
     EventHandlerList ehl = (EventHandlerList)_getPrivateAppField("_events"); 
     MulticastDelegate md = (MulticastDelegate)ehl[key]; 
     if (null != md) 
     { 
      r.Output.WriteLine("<h2>{0}</h2>", handlerName); 
      foreach (Delegate d in md.GetInvocationList()) 
      { 
       Type tt = d.Target.GetType(); 
       string asm = ""; 
       if (_showAssemblies) 
       { 
        asm = string.Format("<font color='red'>[{0}]</font>", tt.Assembly.GetName()); 
       } 
       r.Output.WriteLine("{0}{1}.<font color='blue'>{2}</font><br>", asm, tt, d.Method.Name); 
      } 
     } 
    } 
    object _getPrivateAppField(string fieldName) 
    { 
     return _getPrivateField(typeof(HttpApplication), fieldName, HttpContext.Current.ApplicationInstance); 
    } 

    object _getPrivateField(Type t, string fieldName, object o) 
    { 
     return t.GetField(fieldName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic).GetValue(o); 
    } 

    object _getPrivateField(string fieldName, object o) 
    { 
     return o.GetType().GetField(fieldName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic).GetValue(o); 
    } 

    public bool IsReusable { get { return true; } } 
} 
+0

我喜歡它。對解決問題不太有用,但我喜歡這個。 – RoLYroLLs 2012-12-12 03:28:46