2009-04-14 4 views
15

FormsAuthentication의 LoginUrl을 동적으로 변경하는 방법이 있습니까? 내가 가진 것은 FormsAuth가 보호하는 전체 사이트이지만, 하위 폴더의 일부 페이지에서는 사용자를 다른 로그인 페이지로 이동시키고 FormsAuth가 ReturnUrl 항목을 처리하도록하고 싶습니다. 그럴 수 있습니까 또는 서브 폴더 경우에 대한 자신의 리디렉션 코드를 작성해야합니까?FormsAuthentication LoginUrl 특정 경우에 재정의/변경하는 방법

<forms loginUrl="~/Splash.aspx" ... /> 

보호 된 *에서 .aspx 페이지의 모든 내가

<deny users="?"> 

을 '무엇을 :

~/LogOn1.aspx 
    ~/Protected1.aspx 
    ~/Protected2.aspx 
    ~/Subfolder/ 
    ~/Subfolder/LogOn2.aspx 
    ~/Subfolder/NotProtected.aspx 
    ~/Subfolder/Protected3.aspx 

그래서 내 Web.config의 모습 : 여기

는 예를 들어 레이아웃입니다 d는 ~/Subfolder/Protected3.aspx가 사용자가 익명 인 경우 ~/Subfolder/LogOn2.aspx로 리디렉션됩니다.

내가 한 ~/하위 폴더 /의 Web.config에서의 Web.config의 버전을 박탈를 넣어보십시오

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
     <authentication mode="Forms"> 
     <forms loginUrl="~/Subfolder/LogOn.aspx" name="SiteAuth" protection="All" timeout="30" path="/" defaultUrl="~/Subfolder/default.aspx" requireSSL="true" cookieless="UseCookies" enableCrossAppRedirects="false" /> 
     </authentication> 
     <authorization> 
     <deny users="?" /> 
     </authorization> 
    </system.web> 
</configuration> 

그러나 저를 얻는 모든이 오류입니다 : 내가 생각

It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.

Subfolder 디렉토리를 응용 프로그램으로 만들면이 시점에서 더 많은 문제가 발생할 수 있지만 어쩌면 틀 렸습니다. 응용 프로그램 인 경우 ~/Subfolder의 모든 코드를 나머지 응용 프로그램과 분리하지 않습니까?

+0

동적으로 말하면 하위 폴더의 일부 페이지 만 특정 시간에 loginurl로 리디렉션 하시겠습니까? 또는 하위 폴더의 모든 페이지가 항상 loginurl로 리디렉션되도록 하시겠습니까? – rahkim

+0

익명 액세스를 허용하는 일부 페이지가 하위 폴더에 있으므로 리디렉션 할 필요가 없습니다. 그러나 deny = "?"인 하위 폴더의 페이지는 ~/하위 폴더/LogOn.aspx로 리다이렉트하고 싶습니다. 나머지 사이트의 보호 된 페이지는 ~/LogOn.aspx로 리다이렉트됩니다. – slolife

+0

링크가 도움이 되었습니까? – rahkim

답변

10

당신이 발생하는 문제는 Forms element는 응용 프로그램 수준에서 허용되는 것입니다 - 당신은 하위에 정의 할 수 없습니다 web.config.

Location element을 사용하여 정의 할 수 없으며 FormsAuthentication.LoginUrl 속성은 읽기 전용입니다.

조금만 돌아 다니면 로그인 페이지에 사용자가 도착한 곳 (즉, "ReturnUrl"검색어 문자열의 값을 확인)을 감지하고 코드를 리디렉션하는 코드가있는 것이 가장 좋습니다. 서브 디렉토리에있는 다른 로그인 페이지. 그러나 여러 하위 디렉토리에 대한 사용자 정의 로그인 페이지를 원한다면 이것이 잘 확장되지 않는다는 것을 인정합니다. :(당신의 편집에 repsonse에서


- 예, 제작이 오류를 "해결"할 응용 프로그램을 서브 - 폴더,하지만 당신은 지적으로 당신이 필요로하는 것, 당신은 다음, 더 문제가있는 것 모든 관련 바이너리, app_code를 옮기려면 그 서브 폴더에도 무엇이 들어 있는가? 실제로는 해결책이 아닙니다.

5

각 하위 폴더를 사용하면 별도의 webconfig 파일을 가질 수 있습니다. 그래서 당신은 태그와 하위 폴더에 Web.config의를 둘 수 있었다 :

<authentication mode="Forms"> 
    <forms loginUrl="~/Subfolder/LogOn2.aspx" /> 
</authentication> 
+2

오류 제거 된 web.config 하위 폴더에 넣을 때 오류가 발생합니다. allowDefinition = 응용 프로그램 수준 이상의 'MachineToApplication'. 이 오류는 가상 디렉터리가 IIS에서 응용 프로그램으로 구성되지 않아 발생할 수 있습니다. – slolife

+0

오 ... 나는 더 분명해야했습니다. 하위 폴더에 일반 web.config를 넣어야합니다. 인증 용 태그를 포함하십시오. – rahkim

+0

다음은 여러 구성을 사용하는 샘플입니다. - http://www.codeproject.com/KB/aspnet/multipleWebConfig.aspx – rahkim

7

나는이 문제도 있었지만 여기서 해결하려고 노력했습니다. 오래 전에 내가했던 일은 Page_Load 이벤트의 루트 폴더에있는 기본 login.aspx 페이지에있었습니다. 하위 URL 관리 및 login.aspx 페이지로 돌아 오는 URL을 기반으로 리디렉션을 수행했습니다! 각 서브 디렉토리에 대한 관련 비트.

public void Page_Load(object sender, EventArgs e) 
{ 
//check for existence of ReturnUrl in QueryString  
    //if it contains manage redirect to manage login page 
    if (!String.IsNullOrEmpty(Request.QueryString["ReturnUrl"])) 
    { 
     if (Request.QueryString["ReturnUrl"].Contains("manage")) 
     { 
      Response.Redirect("manage/login.aspx"); 

     } 
    } 
} 
+0

위대한 대답, 내 문제를 해결! 내가 추가 할 수있는 유일한 점은 web.config에서 사용자가 하위 디렉토리 로그인 페이지에 액세스 할 수 있어야하므로 기본 로그인 페이지와 하위 디렉토리 로그인 페이지 사이에 재귀 적 리디렉션이 발생하지 않아야한다는 것입니다. –

관련 문제