문제

다국어 사이트의 URL을 다시 작성하기 위해 HttpModule을 사용하고 있습니다.HttpModule에서 BeginRequest 이벤트에 대한 처리기를 추가하고 문화권 이름이 포함된 경로의 첫 번째 부분을 찾습니다.

예를 들어 /fr-ca/index.aspx는 /index.aspx로 다시 작성되고 스레드의 문화권과 UI 문화권이 3084로 설정됩니다.이것은 잘 작동합니다.

양식 인증을 입력하세요.양식 인증은 매핑되지 않은 URL에서도 여전히 잘 작동하지만 사용자가 권한이 없는 경우 web.config의 인증 섹션에 설정된 loginUrl로 리디렉션되고 ?ReturnUrl= 쿼리 문자열 매개 변수를 포함하여 요청된 URL로 다시 리디렉션을 처리합니다. 사용자가 인증되면 페이지.

사용자가 기본 언어가 아닌 다른 언어로 페이지를 요청하는 경우 여기에는 두 가지 문제가 있습니다.

  1. loginUrl은 다시 작성되기 전에 경로를 무시합니다.
  2. ReturnUrl 매개변수도 원시 경로를 무시했습니다.

Request.RawUrl 대신 Request.Url.PathAndQuery와 동일합니다.

대신 AuthorizeRequest 이벤트에서 파이프라인으로 이동할 수 없습니다. 왜냐하면 여러 위치 경로가 있는 하나의 web.config 파일을 사용하고 있기 때문에 가능한 모든 문화권 값으로부터 보호해야 하기 때문입니다.이것은 또한 첫 번째 문제를 해결하지 못합니다.

리플렉터의 FormsAuthenticationModule을 살펴보고 #1과 #2를 해결하기 위해 이를 변경할 수 있는 위치를 확인했지만 물론 봉인되어 있습니다.

나는 또한 많은 것을 탐색했지만 실행 가능한 해결책을 찾을 수 없습니다.

FormsAuthenticationModule은 UrlAuthorizationModule에서 생성된 401 헤더를 확인합니다.loginUrl 페이지에서 리퍼러(비어 있음)를 찾으면 이를 확인합니다.

이견있는 사람?

편집 #1

저는 IIS 6을 사용하고 있는데 IIS 7은 옵션이 아닙니다.

편집 #2

로컬 리소스를 생성할 때(디자인 보기:도구 > 로컬 리소스 생성), IDE는 페이지 지시문에 다음을 추가했습니다.

Culture="auto" 메타:resourcekey="PageResource1" uiculture="auto"

vs.net 2008에서는 이 점에 주의하세요!최소한 이는 기본 문화권이 참조되지 않는 문제 중 하나를 해결하지만 #1과 #2는 여전히 뛰어난 상태입니다.

편집 3

파이프라인 이벤트 중 하나로 이동하여 자체 리디렉션을 수행할 수 있기를 바랐지만 System.Web.Security.UrlAuthorizationModule OnEnter 메서드 반영에서 401 헤더가 설정되면 메서드가 application.CompleteRequest를 호출한다는 사실을 알게 되었습니다. 짐작할 수 있듯이 EndRequest 이벤트로 바로 이동합니다.이것이 바로 FA 모듈이 리디렉션 수행에 뛰어드는 것인데, 유감스럽게도 제가 직접 리디렉션을 수행하기 위해 앞으로 점프할 수는 없습니다.이 문제를 접하는 사람이 더 이상 없거나 아직 문제를 해결하지 않은 것 같아 놀랐습니다.


예:

양식 인증으로 보호되는 실제 폴더 /members/에 구성원 섹션이 있습니다.

web.config에는 다음이 있습니다.

<authentication mode="Forms">
  <forms loginUrl="~/members/login.aspx" timeout="40" />
</authentication>

그리고...

  <location path="members">
      <system.web>
          <authorization>
              <deny users="?" />
              <allow roles="Members" />
              <deny users="*" />
          </authorization>
      </system.web>
  </location>

인증되지 않은 사용자가 /members/의 인덱스 페이지를 요청하면 FormsAuthenticationModule에 의해 위의 인증 섹션에서 loginUrl로 리디렉션됩니다.또한 요청된 페이지에 ?ReturnUrl 매개변수를 추가합니다.

사용자가 기본 문화권을 사용하여 웹 사이트를 검색하는 경우에는 제대로 작동하지만 내 HttpModule은 경로의 첫 번째 부분에 있는 문화권 이름의 존재 여부를 기반으로 문화권을 설정합니다.

따라서 /fr-ca/members/index.aspx는 /members/index.aspx로 다시 작성되고 문화권/ui 문화권을 캐나다 프랑스어로 설정합니다.불행히도 FormsAuthenticationModule은 원본이 아닌 다시 작성된 URL을 사용하여 사용자를 loginUrl 페이지로 보냅니다.따라서 문화 설정이 손실되고 리디렉션 URL이 올바르지 않습니다.

@Greg에게 도움이 되길 바랍니다.

도움이 되었습니까?

해결책

문제가 해결되었습니다.

핵심은 machine.config httpModule을 지우고 내 사용자 정의 httpModule을 추가한 다음 필요한 기본 httpModule을 다시 추가하는 것이었습니다.이를 통해 사용자 정의 httpModule이 FormsAuthenticationHttpModule 이전에 EndRequest 이벤트로 이동할 수 있었습니다.

<httpModules>
    <clear/>
    <!-- custom -->
    <add name="LocalizationHttpModule" type="LocalizationHttpModule"/>
    <!-- add back defaults, exlude PassportAuthentication, AnonymousIdentification, Profile -->
    <add name="OutputCache" type="System.Web.Caching.OutputCacheModule" />
    <add name="Session" type="System.Web.SessionState.SessionStateModule" />
    <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" />
    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />
    <add name="RoleManager" type="System.Web.Security.RoleManagerModule" />
    <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
    <add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule" />

</httpModules> 

그런 다음 사용자 정의 httpModule에서 EndRequest를 탭하고 401 상태 코드를 찾은 다음 원하는 대로 리디렉션합니다.기본적으로 저는 필요에 맞게 FormsAuthenticationHttpModule OnLeave 메서드의 코드를 다시 작성하고 있습니다.

Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init

    Dim authentication As AuthenticationSection = WebConfigurationManager.GetSection("system.web/authentication")
    If authentication.Mode = AuthenticationMode.Forms Then
        Me._LoginUrl = authentication.Forms.LoginUrl
        AddHandler context.EndRequest, AddressOf Context_EndRequest
    End If

End Sub

Private Sub Context_EndRequest(ByVal sender As Object, ByVal e As EventArgs)
    Dim application As HttpApplication = DirectCast(sender, HttpApplication)
    Dim context As HttpContext = application.Context

    If (context.Response.StatusCode = &H191) Then                
       ' do custom redirect here
    End If

End Sub

다른 팁

내가 생각할 수 있는 유일한 것은 로그인 양식으로 수동으로 리디렉션하는 것입니다.

1) 회원 디렉토리에 대한 모든 접근을 허용합니다.
2) 멤버십의 모든 페이지는 Page의 하위 클래스에서 직접 상속됩니다.
3) Page 서브클래스의 PreInit(?)에서 사용자가 멤버쉽 역할의 멤버인지 확인합니다.
4) 그렇지 않은 경우 ReturnURL 매개변수를 포함하여 로그인 페이지의 URL을 직접 작성하고 사용자를 로그인 URL로 리디렉션하십시오.

web.config에 < location> 섹션을 여러 개 넣어서 이를 해킹할 수도 있습니다.전:< location path="fr-ca/members">< 인증>< form loginUrl="~/fr-ca/members/login.aspx">...하지만 정말 모르겠어요.

아마도 내가 익숙하지 않은 다른 방법이 있을 것입니다.

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