10

우리는 ASP.net Membership을 사용하여 기본 로그인 메커니즘을 제공하는 응용 프로그램을 보유하고 있습니다. 모두 정상적으로 작동하지만 최근 로그인 페이지에서 로그인 페이지로 이동하려고하면 '인증되지 않은 페이지'로 리디렉션된다는 사실을 발견했습니다.ASP.NET 회원 로그인 사용자가 로그인 할 때 무단으로 리디렉션

사용자 흐름의 예.

사용자가 보안 페이지로 이동합니다 (전체 애플리케이션에 로그인해야합니다. 방문 할 수있는 홈 페이지조차도 입니다. 로그인하면 바로 리디렉션됩니다). 이렇게하면 https://www.example.com/Account/Login으로 리디렉션됩니다.

사용자가 로그인하여 홈 페이지 https://www.example.com/으로 리디렉션됩니다. 그들은 로그인되어 있고 모든 것이 잘 작동합니다.

사용자 https://www.example.com/Account/Login

사용자가 일반적인 무단 페이지로 리디렉션로 설정 될 일이 책갈피를 클릭합니다.

나는, 내 AccountController에 <Authorize()> 속성하지만 우리가 이전에 보았던대로 '로그인'행동에 <AllowAnonymous()> 속성을 가지고 로그인하지 않은 경우 잘 작동하지만 당신이 때 그것은 얻을 것으로 보인다 혼란스러운 이 모든 것을보고

AccountController

<Authorize()> _ 
Public Class AccountController 
'''other functions go here''' 

<AllowAnonymous()> _ 
Public Function Login(ByVal returnUrl As String) As ActionResult 
    ViewData("ReturnUrl") = returnUrl 
    Return View() 
End Function 

AuthorizeRedirect 필터

<AttributeUsage(AttributeTargets.[Class] Or AttributeTargets.Method)> _ 
Public Class AuthorizeRedirect 
    Inherits AuthorizeAttribute 
    Private Const IS_AUTHORIZED As String = "isAuthorized" 

    Public RedirectUrl As String = "~/Home/Unauthorized" 

    Protected Overrides Function AuthorizeCore(httpContext As System.Web.HttpContextBase) As Boolean 
     Dim isAuthorized As Boolean = MyBase.AuthorizeCore(httpContext) 

     httpContext.Items.Add(IS_AUTHORIZED, isAuthorized) 

     Return isAuthorized 
    End Function 

    Public Overrides Sub OnAuthorization(filterContext As AuthorizationContext) 
     MyBase.OnAuthorization(filterContext) 

     Dim isAuthorized = If(filterContext.HttpContext.Items(IS_AUTHORIZED) IsNot Nothing, Convert.ToBoolean(filterContext.HttpContext.Items(IS_AUTHORIZED)), False) 

     If Not isAuthorized AndAlso filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated Then 
      filterContext.RequestContext.HttpContext.Response.Redirect(RedirectUrl) 
     End If 
    End Sub 
End Class 

내가 가장 간단한 솔루션은 사용자가 이미 내 로그인 행동에 로그인되어 있는지 확인하는과 재 것이라고 생각 그 (것)들은 나 자신 같이, 이것 같이 무언가.

<AllowAnonymous()> _ 
Public Function Login(ByVal returnUrl As String) As ActionResult 
    If User.Identity.IsAuthenticated() Then 
     Return RedirectToAction("Index", "Home") 
    End If 
    ViewData("ReturnUrl") = returnUrl 
    Return View() 
End Function 

그러나 AuthorizeFilter는 항상 처음에는 건너 뜁니다. 이해할 수는 있지만 마지막 누락 된 부분을 알아낼 수는 없습니다. 사용자가 로그인 할 때 로그인 화면으로 이동하여 홈페이지로 리디렉션하면 '이 페이지를 볼 수있는 권한이 없습니다'라는 메시지가 표시되지 않습니다. 내가 뭘 놓치고 있니?


편집 이미 로그인 한 때, 나는 /Account/Login로 이동

상황이 조금 명확하게합니다. 이 302은 나를 /Home/Unauthorized (내 사용자 정의 페이지)로 리디렉션합니다. 그러나, 나는 여전히 기록하고있다.

네트워크

Network request to Login page, which 302 redirects to Unauthorized

무단 페이지를 요청합니다. 내가 로그인 한 상태에서 노란색 섹션이 강조 표시된 것을 볼 수 있습니다. 로그인 한 경우에만 나타납니다. 로그인하지 않으면 아무 것도 표시되지 않습니다.

Unauthorized page

문제는 내가 이미 로그인과에 [AllowAnonymous] 속성이있는 페이지로 이동하려고 할 때 응용 프로그램이 무엇을해야할지 모르는 것 같다. 무엇보다, 내가보기에는 여기있는 행동이 나에게 로그인 페이지를 다시주는 것이 바람직합니다. 왜냐하면 그것이 혼란 스럽기는하지만 여전히 이상적이지 않기 때문입니다.


편집 2 - 여기

라인하여 코드 라인을 통해 스테핑 코드 라인을 통해 스테핑의 결과이다.

페이지 /Account/Login는 반면에 기록.

먼저 중단을 OnAuthorization 부에 AuthorizeRedirect 필터.

Public Overrides Sub OnAuthorization(filterContext As AuthorizationContext) 
    MyBase.OnAuthorization(filterContext) 

    Dim isAuthorized = If(filterContext.HttpContext.Items(IS_AUTHORIZED) IsNot Nothing, Convert.ToBoolean(filterContext.HttpContext.Items(IS_AUTHORIZED)), False) 

    If Not isAuthorized AndAlso filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated Then 
     filterContext.RequestContext.HttpContext.Response.Redirect(RedirectUrl) 
    End If 
End Sub 

Dim isAuthorized으로 시작하는 줄은 False를 반환합니다. filterContext.HttpContext.Items(IS_AUTHORIZED)은 아무 것도 없습니다 (항목 목록에는 없습니다).

그러면 다음 If 문이 True (Not isAuthorized And Isso ... IsAuthenticated)로 평가되어 RedirectUrl으로 리디렉션됩니다.

그런 다음이 단계는 false로 평가되는 것을 제외하고는 동일한 단계를 거쳐 돌아가는 것으로 나타납니다. 이는 리디렉션이 발생하지 않는다는 것을 의미합니다. 다만 '승인되지 않은'페이지가로드되고 실행되는 것 같습니다. 다시 같은 코드.

AccountControllerLogin 기능 맨 위에 다음 블록을 추가하려고 시도했습니다.

If User.Identity.IsAuthenticated() Then 
     Return RedirectToAction("Index", "Home") 
    End If 

하지만, 물론, 이미 Unauthorized에 저를 리디렉션 것 후 (단계별 검증) 할 때까지 작업이 코드가 충돌되지 발생하기 전에 필터가 실행되기 때문이다. AuthorizationAttribute에 대한

+0

'AuthorizeRedirect'는 어디에 적용됩니까? –

+0

코드에 대한 액세스 권한이 없어도 'filters.add (Authorizeredirect)'와 같은 표준 FilterConfig에 설정되어 있습니다. –

+0

사용자가 승인되지 않은 것 같습니다. 그게 사실이야? 무단으로 리디렉션 된 후/home/index에 도달 할 수 있습니까? –

답변

2

기본 클래스가 OnAuthorization 방법이 코드가 같은 :

bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true) 
         || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true); 

if (skipAuthorization) 
{ 
    return; 
} 

if (AuthorizeCore(filterContext.HttpContext)) 
// ... 

을 컨트롤러 액션이에 정의 된 AllowAnonymousAttribute이있는 경우, 귀하의 AuthorizeCore 메서드가 호출되지 않습니다.

그 때문에 filterContext.HttpContext.Items(IS_AUTHORIZED)은 결코 설정되지 않습니다.

here의 코드를 복사하여 기본 클래스를 호출하지 않고 OnAuthorization을 구현할 수 있습니다. 이렇게하면 원하는 방식으로 캐싱을 처리 할 수 ​​있습니다.

덧붙여 말하자면, 인증 파이프 라인의 나중 프로세스가 로그인 페이지로 리다이렉트 한 것을 확인하지 못했습니다. 따라서 OnAuthorization의 기본 구현은 filterContext.Result을 새 HttpUnauthorizedResult 인스턴스로 설정합니다. 따라서 OnAuthorization을 무시하고 처음부터 리디렉션을 수행하는 이유가 무엇인지 분명하지 않습니다.사용자 지정 인증 코드를 원한다면 true 또는 falseAuthorizeCore에서 반환하는 것으로 충분합니다.