왜 AuthorizeAttribute 리디렉션 로그인 페이지에 대한 인증 및 권한 부여했습니다.

StackOverflow https://stackoverflow.com/questions/238437

문제

에 ASP.NET MVC 표시할 수 있습니다 컨트롤러 방법으로 AuthorizeAttribute, 은 다음과 같습니다.

[Authorize(Roles = "CanDeleteTags")]
public void Delete(string tagName)
{
    // ...
}

즉,이 경우,현재 로그인한 사용자가에서"CanDeleteTags"역할,컨트롤러 방법은 없을 것이라고.

불행하게도,실패, AuthorizeAttributeHttpUnauthorizedResult, 는 항상 반 HTTP 상태 코드는 401.그러면 로그인 페이지로 리디렉션.

는 경우에는 사용자에 기록되지 않,이 완벽한 의미가 있습니다.그러나,경우에는 사용자 로그인이지만,지에서 필요한 역할,그것은 혼란 서비스를 제공하기 위해서 로그인 페이지.

그것은 보인다 AuthorizeAttribute 클래식으로 남을 록앨범 인증 및 허가합니다.

이 같은 감독에 ASP.NET MVC,또는 나는 뭔가?

을 요리 DemandRoleAttribute 구분하는 두.할 때 사용하지 않는 인증된 반환 HTTP401,그들이 보내면 로그인 페이지입니다.사용자가 로그인할 경우에,그러나지 않을 필요한 역할을 만듭니다 NotAuthorizedResult 대신 합니다.현재 이 리디렉션하여 오류 메시지가 나타납니다.

확실히 하지 않았을까요?

도움이 되었습니까?

해결책

처음 개발되었을 때,시스템입니다.웹.Mvc.AuthorizeAttribute 었을 것- 오래된 버전의 HTTP 사양에 사용되는 상태 코드는 401 모두를 위해"무단"및"인증되지 않은".

에서 원래 사양:

요청이 이미 포함되어 있는 권한이 부여,다음 401 응답을 나타내는 권한 부여되었기를 거부한 자격 증명입니다.

사실,당신은 당신이 볼 수있는 혼란 권리가 사용하는 단어"인증을 때"그 뜻은"인증을".일상에서 연습,그러나,그것은 더 감각을 반환 403 금지할 때 사용자가 인증지만 권한이 없습니다.이 사용자가 두 번째로 설정의 자격을 줄 것들-나쁜 사용자 경험의 모든 주위입니다.

가장 고려영 시스템-려고 하면 파일을 읽지 않을에 액세스할 수 있는 권한이 있지 않습 다음과 같이 로그인 화면!

고맙게도,HTTP 사양 업데이트되었(월 2014)을 제거하는 모호성.

에서"하이퍼 텍스트 전송 프로토콜(HTTP/1.1):인증"(RFC7235):

401(Unauthorized)상태 코드를 나타내는 요청에 적용되지 않았기 때문에 부재로 유효한 인증 자격증명을 대상 리소스입니다.

에서"하이퍼텍스트 전송 프로토콜(HTTP/1.1):미 콘텐츠"(RFC7231):

403(금)상태 코드를 나타내는 서버가 이러한 요청을 거부 권한을 부여하는니다.

흥미롭게도,시간 ASP.NET MVC1 발표되었다의 동작 AuthorizeAttribute 정확했습니다.지금 행동이 잘못된 HTTP/1.1specification 수정되었습니다.

보를 변경하려는 시도 ASP.NET's 로그인 페이지로 리디렉션,그것은 쉽게 수정하는 것이 문제입니다.을 만들 수 있는 새로운 특성과 동일한 이름(AuthorizeAttribute) 에서 당신의 웹사이트의 기본 네임스페이스 (이것은 매우 중요하다)컴파일러가 자동으로 그것을 선택하는 대신 MVC 의 표준을 하나입니다.물론 당신은 항상 수 있게 특성이 새로운 이름을 경우 당신은 오히려는 접근 방식이다.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAuthenticated)
        {
            filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
        }
        else
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

다른 팁

추가 이하의 로그인 Page_Load 기능:

// User was redirected here because of authorization section
if (User.Identity != null && User.Identity.IsAuthenticated)
    Response.Redirect("Unauthorized.aspx");

사용자가 리디렉션이 있지만 이미 이 기록에서 보여줍니다,무단 페이지입니다.로그인하지 않은 경우에,그것은 폭포를 통해 보여 로그인 페이지입니다.

나는 항상이라고 생각했습니다.당신이 로그인하는 경우에 당신을 공격하려고 페이지를 필요로 하는 역할을,당신이하지 않을 얻을 전달하는 로그인을 요구하는 화면으로 로그인한 사용자는 역할이 있습니다.

을 추가할 수 있습 로직 로그인을 확인하는 페이지를 참조하는 경우 사용자를 인증하게 됩니다.을 추가할 수 있습니다 친절한 메시지 이유를 설명하는 그들 bumbed 다.

불행히도,당신과 함께 다루고 있어의 기본 동작 ASP.NET forms 인증이 있습니다.이 문제를 해결할 수 있는 방법이(나는 그것을 시도하지 않은)여기서 설명:

http://www.codeproject.com/KB/aspnet/Custon401Page.aspx

(그것의 특정하지 않습 MVC)

내가 생각하는 대부분의 경우에는 최적의 솔루션을 제한 액세스 권한이 없는 자원 이전에 사용자는 노력을 얻을 수 있습니다.을 제거하여/어지의 링크나 버튼을 걸릴 수 있습니다 그들은 이 무단 페이지입니다.

그것은 아마도 좋을 것이다 추가 매개 변수에 속성을 지정하는 리디렉션하는 권한이 없는 사용자.그러나 그러는 동안,나는 AuthorizeAttribute 로 안전 net.

이 시도에서 귀하에 Application_EndRequest 처리기의합니다.ascx 파일

if (HttpContext.Current.Response.Status.StartsWith("302") && HttpContext.Current.Request.Url.ToString().Contains("/<restricted_path>/"))
{
    HttpContext.Current.Response.ClearContent();
    Response.Redirect("~/AccessDenied.aspx");
}

을 사용하는 경우에는 aspnetcore2.0,사용:

using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace Core
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class AuthorizeApiAttribute : Microsoft.AspNetCore.Authorization.AuthorizeAttribute, IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationFilterContext context)
        {
            var user = context.HttpContext.User;

            if (!user.Identity.IsAuthenticated)
            {
                context.Result = new UnauthorizedResult();
                return;
            }
        }
    }
}

나의 케이스에서 문제가 있었다"HTTP 사양에 사용되는 상태 코드는 401 모두를 위해"무단"및"인증되지 않은"".로 ShadowChaser 말했다.

이 솔루션은 나를 위해 작동:

if (User != null &&  User.Identity.IsAuthenticated && Response.StatusCode == 401)
{
    //Do whatever

    //In my case redirect to error page
    Response.RedirectToRoute("Default", new { controller = "Home", action = "ErrorUnauthorized" });
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top