문제

액세스를 제한하려는 여러 .aspx 페이지가있는 폴더가 있습니다. 해당 폴더에 web.config를 추가했습니다 <deny users="?"/>.

문제는 urlrewrite를 사용하는 동안 .aspx 파일에 대한 물리적 경로로 ReturnUrl이 자동으로 생성된다는 것입니다.

수동 인증 점검 및 리디렉션을 수행하지 않고 RetoryUrl을 조작하는 방법이 있습니까? Code-Behind 또는 Web.config에서 returnUrl을 설정하는 방법이 있습니까?

편집하다: 응용 프로그램은 ASP.NET 2.0 WebForms를 사용하고 있습니다. 3.5 라우팅을 사용할 수 없습니다.

편집 2: 401 상태 코드가 캡처되지 않은 것 같습니다. 보호 페이지의 경우 302를 반환하고 returnUrl을 사용하여 로그인 페이지로 리디렉션합니다. 보호 페이지의 경우 401을 반환하지 않습니다. 흠 ... 흥미로운 ... 참조 : http://msdn.microsoft.com/en-us/library/aa480476.aspx

이렇게하면 더 어려워집니다 ... 리버스 재 작성 규칙을 작성하여 리턴 러를 재시송하고 반환하지 않으면 대체하기 위해 리버스 리 러핑 규칙을 작성해야 할 수도 있습니다. rawurl과 함께.

다른 사람이 다른 아이디어가 있습니까?

도움이 되었습니까?

해결책 3

결국 URL에 ReturnUrl의 존재를 확인하고 Global.asax의 Endrequest 단계에서 RawUrl로 교체했습니다. 이것은 지금 나를 위해 작동합니다 ...

이것 블로그 게시물 내가 설정하는 데 도움이되었습니다.

protected void Application_EndRequest(object sender, EventArgs e)
{
    string redirectUrl = this.Response.RedirectLocation;
    if (!this.Request.RawUrl.Contains("ReturnUrl=") && !string.IsNullOrEmpty(redirectUrl))
    {
        this.Response.RedirectLocation = Regex.Replace(redirectUrl, "ReturnUrl=(?'url'[^&]*)", delegate(Match m)
        {
            return string.Format("ReturnUrl={0}", HttpUtility.UrlEncode(this.Request.RawUrl));
        }, RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);
    }
}

다른 팁

확인 해봐. 도움이 되었기를 바랍니다.

#region [ Imports ]

using System;
using System.Web;
using System.Web.Security;

#endregion

namespace Foo.Handlers
{

    public class AuthModule : IHttpModule
    {

        #region IHttpModule Members

        public void Init(HttpApplication application)
        {
            application.PostReleaseRequestState += delegate(object s, EventArgs e)
                {
                    if (application.Response.StatusCode == 401)
                        application.Response.Redirect(FormsAuthentication.LoginUrl + "?ReturnUrl=" + HttpUtility.UrlEncode(application.Request.RawUrl), true);
                };
        }

        public void Dispose() { }

        #endregion

    }

}

<modules>
  <add name="AuthModule" type="Foo.Handlers.AuthModule, Foo"/>
</modules>

다음 컨트롤 어댑터를 작성하여 For Action 속성으로 양식 태그를 다시 작성하십시오. 나는 이것을 ASP.NET 2.0 앱을 정보 URL Rewriter. 나는 이것으로부터 그것을 얻었다 GU의 블로그 게시물.

이 클래스를 app_code 폴더에 넣으십시오.

using System.IO;
using System.Web;
using System.Web.UI;

public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter
{
    protected override void Render(HtmlTextWriter writer)
    {
        base.Render(new RewriteFormHtmlTextWriter(writer));
    }
}

public class RewriteFormHtmlTextWriter : HtmlTextWriter
{
    public RewriteFormHtmlTextWriter(TextWriter writer) : base(writer)
    {
        base.InnerWriter = writer;
    }

    public RewriteFormHtmlTextWriter(HtmlTextWriter writer) : base(writer)
    {
        this.InnerWriter = writer.InnerWriter;
    }

    public override void WriteAttribute(string name, string value, bool fEncode)
    {

        // If the attribute we are writing is the "action" attribute, and we are not on a sub-control, 
        // then replace the value to write with the raw URL of the request - which ensures that we'll
        // preserve the PathInfo value on postback scenarios

        if ((name == "action"))
        {
            if (HttpContext.Current.Items["ActionAlreadyWritten"] == null)
            {

                // Because we are using the UrlRewriting.net HttpModule, we will use the 
                // Request.RawUrl property within ASP.NET to retrieve the origional URL
                // before it was re-written.  You'll want to change the line of code below
                // if you use a different URL rewriting implementation.
                value = HttpContext.Current.Request.RawUrl;

                // Indicate that we've already rewritten the <form>'s action attribute to prevent
                // us from rewriting a sub-control under the <form> control
                HttpContext.Current.Items["ActionAlreadyWritten"] = true;

            }
        }
        base.WriteAttribute(name, value, fEncode);
    }
}

그런 다음 app_browsers 폴더 에서이 .Browser 파일을 작성하십시오.

<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter controlType="System.Web.UI.HtmlControls.HtmlForm" adapterType="FormRewriterControlAdapter" />
    </controlAdapters>
  </browser>
</browsers>

ASP.NET 3.5를 사용하는 경우 대신 asp.net urlrouting을 사용하십시오. 그러나 승인 매뉴얼을 확인해야합니다.

http://chriscavanagh.wordpress.com/2008/03/11/aspnet-routing-goodbye-url-rewriting/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top