2011-12-14 3 views
3

폼 기반 응용 프로그램이 있습니다. 응용 프로그램은 로그인 컨트롤을 사용하여 생성 된 표준 ASP.Net 마법사입니다. 루트의 web.config은 폼 기반 인증을 위해 순서대로 표시됩니다. <roleManager> 요소를 How To: Use Role Manager in ASP.NETtype="System.Web.Security.SqlRoleProvider" (Windows 토큰 대신)을 사용하도록 변경해야했습니다.ASP.Net : 로그인 컨트롤, LoginUser_LoggedIn 및 역할 채우기

관리자, 엔지니어, 고객이라는 세 가지 역할을 설정했습니다. admin (관리자), eddie (엔지니어) 및 cathy (고객)의 세 사용자가 있습니다. ASP.Net Configuration Tool을 사용하여 사용자와 역할을 확인했습니다.

각 역할에는 디스크에 고유 한 디렉토리가 있으며 각 역할에는 고유 한 ASPX 파일 모음과 '방문 페이지'가 있습니다. 각 디렉토리에는 해당 역할에 대한 액세스를 제한하기 위해 web.config이 있습니다. 예 :

<location path="~/Engineers"> 
    <system.web> 
    <authorization> 
     <allow roles="Engineers" /> 
     <deny users="*"/> 
    </authorization> 
    </system.web> 
</location> 

성공적으로 로그인하면 LoginUser_LoggedIn을 연결하여 도착 URL을 작성합니다. 내가 겪고있는 문제는 로그인시 사용자의 역할이 채워지지 않아 좋은 리디렉션이 발생하지 않는다는 것입니다. 아래 코드에서 rolesArray의 크기는 0입니다.

아이디어가 있으십니까? 다른 각도에서 접근해야합니까?

Private Sub LoginUser_LoggedIn(sender As Object, e As System.EventArgs) Handles LoginUser.LoggedIn 

    Try 
     Dim rolesArray() As String 
     rolesArray = Roles.GetRolesForUser() 
     Debug.Assert(rolesArray.Length > 0) 

     If (Roles.IsUserInRole("Administrators") = True) Then 
      LoginUser.DestinationPageUrl = "~/Administrators/Dashboard.aspx" 
     ElseIf (Roles.IsUserInRole("Engineers") = True) Then 
      LoginUser.DestinationPageUrl = "~/Engineers/Workspace.aspx" 
     ElseIf (Roles.IsUserInRole("Customers") = True) Then 
      LoginUser.DestinationPageUrl = "~/Customers/Dashboard.aspx" 
     Else 
      Debug.Assert(False) 
     End If 
    Catch ex As Exception 
     Debug.Print(ex.ToString) 
    End Try 

End Sub 

답변

4

로그인시 같은 요청은 쿠키가 (당신이 this.User.Identity.IsAuthenticated을 선택하면 예를 들어, 너무 false를 반환) 사용할 수 없습니다. 이 요청이 진행되는 동안 쿠키가 설정되고 이후 요청시 쿠키를 사용할 수 있기 때문입니다.

공통 페이지로 리디렉션 한 다음이 검사를 수행하고 다시 리디렉션하거나 로그인 컨트롤의 사용자 ID를 사용하여 데이터베이스에서 직접 역할을 쿼리하는 것이 좋습니다.

+0

감사합니다. Brian. 나는 User.IsAuthenticated가 로그인 한 사용자에 대해 False라는 것을 알아 냈습니다. 적어도 말하기에 이상한. – jww

+0

@noloader 초기화하지 않는 코드가 init 또는 그와 같은 시간에 발생하고로드 된 이벤트가로드 후 실행되고 응답을 처리하고 멤버를 확인하고 티켓을 작성한다고 생각할 때. 이것이 아마도 이유이며, 다음 번 다시 게시 할 때 사용할 수있는 이유 일 수 있습니다. –

+0

늦게 답장을 드려 죄송합니다. 이제 성공적인 로그인은 사용자를'LoginSuccess.aspx'로 데려갑니다. 'LoginSuccess.aspx' 페이지에서'User._username'이 유효합니다. 불행히도,'User._roles'는 여전히 비어있어, 나의 역할 기반 리디렉션은 실패합니다. 'Roles.IsUserInRole'과'User.IsInRole' 둘 다 잘못된 정보를 제공합니다. 나는'User.IsRoleListCached'가 true라는 것을 알았고 (역할 공급자는'SqlRoleProvider'입니다.) 역할 목록을 강제로 업데이트 할 수있는 방법이 있습니까 (IntelliSense를 통해 볼 수 없었습니다)? – jww