우리는 ASP.net Membership을 사용하여 기본 로그인 메커니즘을 제공하는 응용 프로그램을 보유하고 있습니다. 모두 정상적으로 작동하지만 최근 로그인 페이지에서 로그인 페이지로 이동하려고하면 '인증되지 않은 페이지'로 리디렉션된다는 사실을 발견했습니다.ASP.NET 회원 로그인 사용자가 로그인 할 때 무단으로 리디렉션
나는, 내 AccountController에사용자 흐름의 예.
사용자가 보안 페이지로 이동합니다 (전체 애플리케이션에 로그인해야합니다. 방문 할 수있는 홈 페이지조차도 입니다. 로그인하면 바로 리디렉션됩니다). 이렇게하면 https://www.example.com/Account/Login으로 리디렉션됩니다.
사용자가 로그인하여 홈 페이지 https://www.example.com/으로 리디렉션됩니다. 그들은 로그인되어 있고 모든 것이 잘 작동합니다.
사용자 https://www.example.com/Account/Login
사용자가 일반적인 무단 페이지로 리디렉션로 설정 될 일이 책갈피를 클릭합니다.
<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
(내 사용자 정의 페이지)로 리디렉션합니다. 그러나, 나는 여전히 기록하고있다.
네트워크
무단 페이지를 요청합니다. 내가 로그인 한 상태에서 노란색 섹션이 강조 표시된 것을 볼 수 있습니다. 로그인 한 경우에만 나타납니다. 로그인하지 않으면 아무 것도 표시되지 않습니다.
문제는 내가 이미 로그인과에 [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로 평가되는 것을 제외하고는 동일한 단계를 거쳐 돌아가는 것으로 나타납니다. 이는 리디렉션이 발생하지 않는다는 것을 의미합니다. 다만 '승인되지 않은'페이지가로드되고 실행되는 것 같습니다. 다시 같은 코드.
AccountController
의 Login
기능 맨 위에 다음 블록을 추가하려고 시도했습니다.
If User.Identity.IsAuthenticated() Then
Return RedirectToAction("Index", "Home")
End If
하지만, 물론, 이미 Unauthorized
에 저를 리디렉션 것 후 (단계별 검증) 할 때까지 작업이 코드가 충돌되지 발생하기 전에 필터가 실행되기 때문이다. AuthorizationAttribute에 대한
'AuthorizeRedirect'는 어디에 적용됩니까? –
코드에 대한 액세스 권한이 없어도 'filters.add (Authorizeredirect)'와 같은 표준 FilterConfig에 설정되어 있습니다. –
사용자가 승인되지 않은 것 같습니다. 그게 사실이야? 무단으로 리디렉션 된 후/home/index에 도달 할 수 있습니까? –