0

사용자 정의 authorizeattribute 작동하지 내 메인 사이트 컨트롤러에 적용 :권한 부여 내가 표시에게 "권한이 없습니다"라는 메시지를 수있는 컨트롤러로 리디렉션하기위한 것입니다 내 MVC 컨트롤러에 대한 매우 간단한 권한 부여 특성을 만들었습니다

[ReportAuthorize([email protected]"Domain\GroupName")] 
public class ReportController : Controller 
{ 
    //etc 
} 

@ "Domain \ GroupName"에도 불구하고 퇴장합니다. 실제로 사용자 = @ "Domain \ MyUserName"으로 변경하면 여전히 실패합니다!

사이트에 대해 사용하도록 설정된 IIS 설정 익명 인증을 추적했습니다. 아쉽게도이 프로젝트는 올바른 특성을 갖고 있지 않은 다른 많은 컨트롤러가있는 더 큰 MVC 프로젝트의 일부이기 때문에 프로덕션 시스템에서 익명 액세스를 비활성화 할 수 없습니다. 그러나 IIS에서 로컬로 변경하면 정상적으로 작동합니다.

는 지금은 정상적인 권한 부여 속성을 변경하는 경우 :

[Authorize(Roles = @"Domain\GroupName")] 
public class ReportController : Controller 
{ 
    //etc 
} 

나는 (내가 권한이없는 사용자가 연결을 시도 할 때를위한 특별한 행동을 정의하지 않았기 때문에 나는 가정)에서 얻을.

이 속성 상황을 해결하기위한 나의 옵션에는 어떤 것이 있습니까? 익명 성을 얻기 위해 사용자를 적절히 인증하기 전에 ReportsAuthorize 특성을 가져와야합니다.

답변

0

좋아요, 그래서 약간의 통증과 고통 후에 마침내이 문제를 해결했습니다. 문제의 일부는이 컨트롤러가 IIS에서 익명 인증을 사용하지 않도록 설정할 수있는 큰 프로젝트에 있다는 것입니다.

[ReportAuthorize(Users = @"domain\me,domain\etc", Roles = @"domain\groupname")] 
[Authorize] 
public class ReportController : Controller 
{ 
    //etc 
} 

여기 권한 부여 속성의 :

public class ReportAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (Users.Contains(httpContext.User.Identity.Name) || Roles.Split(',').Any(s => httpContext.User.IsInRole(s))) //this if checks users and roles using OR logic 
     { 
      return true; 
     } 
     return false; 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary 
     { 
      {"action", "ReportDenied"} 
      , 
      {"controller", "Authorization"} 
     }); //this redirect sends you to a "not permitted" page 
    } 
} 

나는 사이트가 도메인을 확인하고 계정 정보를로드 할 수 있도록 권한 부여 속성을 필요

여기 컨트롤러입니다. 그런 다음 authorizationcore를 무시하는 사용자 지정 특성은 OR 논리를 사용하여 값을 확인합니다 (기본 AND 논리 대신 필요 한 사용자/역할을 포함하는 권한 부여 특성 두 개를 사용하여 증명).

0

현재 사용자가 인증되었는지 (filterContext.HttpContext.User.Identity.IsAuthenticated) 확인하고 싶습니다.

그렇지 않은 경우 base.HandleUnauthorizedRequest으로 전화하면 Windows 자격 증명에 대한 요청이 전송 될 수 있습니다.

사용자가 인증 된 경우 리디렉션 논리를 구현하십시오.

그렇다면 "승인되지 않은"페이지를 표시하기 위해 표준 AuthorizeAttribute을 사용하고 사용자 정의 오류를 사용하는 것이 더 간단하지 않겠는가?

+0

표준 authorizeattribute의 문제점은 groupname을 내려 놓으면 내 자격 증명에 문제가 있지만 제대로 인증하지 못하고 취소 할 때까지 반복적으로 묻는 것입니다. –

+0

@CBauer - 프롬프트가 문제인 경우 사용자 정의 속성으로 이동하십시오.내 경험으로는 문제가되지 않았습니다. MvcSiteMapProvider와 같은 보안 트리밍 기능을 사용하여 사용자가 승인되지 않은 URL에 대한 링크를 볼 수 없기 때문입니다. 따라서 사용자는 프롬프트에 맞닥 뜨리는 경우가 거의 없습니다. – Joe

+0

안타깝게도 보안을 위해 노력하는 페이지는 직접 링크로 배포되는 사이트입니다. 역할을 타겟팅하고 해당 역할이없는 사람들에게 "귀하는 액세스 할 수 없습니다. 이 리소스 "페이지. –

관련 문제