2010-07-21 2 views
3

그래서, 내 IPrincipal.IsInRole (...) 내가 너무 좋아하고 FormsAuthentication을 사용하고 구현했습니다 :권한 부여하고 FormsAuthentication과 함께 메시지를 거부

다음
<authentication mode="Forms"> 
    <forms loginUrl="Login.aspx" name="someName" timeout="600"/> 
</authentication> 

나는 당신을 필요로하는 페이지를 인증 할 수있다 그리고 당신은 "roleA"를 가지고있다. 다음과 같이 구성됩니다.

<location path="SomePage.aspx"> 
    <system.web> 
    <authorization> 
    <allow roles="roleA" /> 
    <deny users="*"/> 
    </authorization> 
    </system.web> 
</location> 

이제 웹 응용 프로그램에 로그인하지만 roleA가없는 사용자로 로그인합니다. SomePage.aspx를 방문하면 forms 요소의 loginUrl에 지정된 URL 인 Login.aspx로 리디렉션됩니다. 그래서, 내 질문은 내가 거부 된 메시지 또는 URL을 지정할 수 있어야합니까? 사용자가 인증되었지만 승인되지 않은 경우 왜 로그인 페이지로 리디렉션하려고합니까? 그것은 사용자에게 지옥처럼 혼란 스럽습니다. 나는 간단한 것을 놓치고 있다고 말해주세요.

읽어 주셔서 감사합니다.

답변

1

네, 조금 성가 셨습니다. 누군가 더 간단한 아이디어를 가지고 있을지 모르지만, 우리가 생각해 낸 솔루션 (해킹)은 사용자가 로그인 페이지로 리디렉션 될 때 ASP.NET이 쿼리 문자열에 추가하는 원래 요청 된 URL을 찾는 것입니다. 로그인의를 Page_Load() 이벤트에서

<configSections> 
    <section name="authorizationFailureMessages" type="System.Configuration.NameValueSectionHandler, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    ...etc... 
</configSections> 

<authorizationFailureMessages> 
    <add key="MemberResources" value="MembershipRequired" /> 
    <add key="Staff" value="StaffOnly" /> 
    <add key="Departments/Administration/BoardOfDirectors" value="BoardOfDirectorsOnly" /> 
    ...etc... 
</authorizationFailureMessages> 

:

우리는 키 인증 메시지에 리디렉션 URL의 조각을 일치/값 세트를 저장하는 새로운 Web.config의 섹션을 만들었습니다. aspx 페이지, 우리는 적절한 텍스트 표시하는 메시지 페이지로 리디렉션 발생한 (UN) 인증 이벤트 확인하려면이 URL을 사용하는 메소드를 호출

private void DisplayAppropriateAuthorizationMessage() 
{ 
    if (!Page.User.Identity.IsAuthenticated) 
     return; 

    string redirectUrl = FormsAuthentication.GetRedirectUrl(Page.User.Identity.Name, false); 

    if (string.IsNullOrEmpty(redirectUrl)) 
     return; 

    NameValueCollection authorizationFailureMessages = ConfigurationManager.GetSection("authorizationFailureMessages") as NameValueCollection; 

    if (authorizationFailureMessages == null) 
     return; 

    foreach (string key in authorizationFailureMessages.AllKeys) 
    { 
     if (redirectUrl.Contains(key)) 
     { 
      Response.Redirect(String.Format("Message.aspx?{0}={1}", Constants.QueryStringKeys.ERRORMESSAGENAME, authorizationFailureMessages[ key ]), true); 
     } 
    } 
} 
+0

아,이 질문에 답할 수 있어야한다. 나는 이런 식으로 할 필요가 없기를 바랐다. (이것은 도움이되고, 어리석은 느낌이다.) –

+0

나는 :) ASP.NET이 권한 부여 실패의 원인이 된 특정 역할에 대한 참조를 공개하면 (예 : 요청 개체에서) 이상적인 솔루션이 될 것입니다. –

+0

권한이 있지만 단순히 로그인하지 않고 URL을 치려고하는 사용자에게 인증되지 않은 메시지가 표시되지 않습니까? – Chris

1

Roles.IsUserInRole을 - 당신은 그냥 사용하는 경우 이 페이지에서는 코드 뒤에이 코드를 넣습니다. 페이지가 많은 경우 기본 클래스에 넣고 web.config 또는 페이지 당 데이터베이스를 읽는 방법을 고려해 볼 수 있습니다. 나는 이것이 당신에게 가장 통제력을 줄 것이라고 믿습니다.

0

기본적으로 @MattPeterson의 솔루션에 동의합니다. 그러나 두 가지 개선점을 제안합니다.

  1. 제 생각에 "당신이하는 역할에 따라, 당신은 그 페이지를 방문하는 것이 허락되지 않습니다"라고 말하면 충분합니다. 필요한 추가 역할을 알 필요가 없으므로 웹 사이트의 권한 관리 세부 정보가 노출됩니다.

  2. 각 폴더에있는 web.config에서 액세스 제어 목록을 얻을 수 있으므로 <add key="MemberResources" value="MembershipRequired" />을 다시 쓸 필요가 없습니다.

나는 당신이 당신의 Web.config에

<authorization> 
    <deny users="?" /> 
</authorization 

에 비슷한 일을해야한다 생각합니다.

관련 문제