2017-02-03 1 views
0

ASP.Net MVC 응용 프로그램에서 작업하고 있습니다. 인증되지 않았거나 AD 그룹에없는 모든 사용자에 대한 액세스를 거부하고 싶습니다. 이 AD 그룹 만 액세스 할 수 있어야합니다. 이것에 대한 예외는 "당신은지나 가지 않을 것입니다!" 페이지. 누구나 액세스 할 수 있습니다. 프로젝트 루트에서 권한 설정 및 "액세스 거부"페이지 설정

, 나는 (파일의 나머지 부분이 간결 트리밍) 내 Web.config의이 있습니다
<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.web> 
     <customErrors mode="On"> 
      <error statusCode="401" redirect="/ui/Other/YouShallNotPass.html" /> 
     </customErrors> 
     <compilation debug="true" targetFramework="4.5.2" /> 
     <httpRuntime targetFramework="4.5.2" /> 
     <authentication mode="Windows" /> 
     <authorization> 
      <allow roles="allowedrole"/> 
      <deny users="*"/> 
     </authorization> 
    </system.web> 
    <system.webServer> 
     <httpErrors> 
      <remove statusCode="401" /> 
      <error statusCode="401" 
        subStatusCode="2" 
        responseMode="ExecuteURL" 
        path="/ui/Other/YouShallNotPass.html" /> 
     </httpErrors> 
    </system.webServer> 
</configuration> 

나는 ui/Other/YouShallNotPass.html 옆에 앉아 두 번째의 Web.config 있습니다. 내가 존재하지 않는 하나에 AD 그룹을 설정하여이를 테스트 할 수있어

<configuration> 
    <system.web> 
     <authorization> 
      <allow users="?"/> 
     </authorization> 
    </system.web> 
</configuration> 

:이 기타의 방법으로 인증하거나, 누군가가이 페이지에 액세스 할 수 있도록 기대합니다. 나는 존재하지 않는 그룹의 일부가 아니기 때문에 YouShallNotPass.html 페이지를 볼 것으로 예상됩니다.

예상대로 작동하지 않습니다. 브라우저에서 다음 오류가 표시됩니다.

오류 메시지 401.2 : 허가되지 않음 : 서버 구성으로 인해 로그온하지 못했습니다. 제공 한 자격 증명 및 웹 서버에서 사용할 수있는 인증 방법을 기반으로이 디렉터리 또는 페이지를 볼 수있는 권한이 있는지 확인하십시오.

YouShallNotPass.html을 직접 요청하면 사용자/패스를 묻는 메시지가 표시되면 액세스 할 수 있습니다.

내가 뭘 잘못하고 있니? 사용자가 권한이없는 경우 왜 401 페이지를 제공하지 않습니까?

+0

'YouShallNotPass.html'의 web.config 파일에''을 삽입하고 어떻게되는지보십시오. 브라우저가 여전히 사용자/패스를 묻는 메시지를 표시하기 때문에 페이지에 Windows 인증이 필요하다는 것을 의미합니다 (기본 web.config에 입력 했으므로 덮어 쓰지 않았으므로). – Alisson

+0

'YouShallNotPass.html'을 직접 요청할 때 더 이상 사용자/패스를 묻지 않습니다. 하지만 다른 페이지와 나는 여전히 원래의 오류가 발생합니다. – Amy

+0

액세스 풀 사용자가 인증하려는 데이터베이스에 액세스 할 수 없습니까? –

답변

0

해결 방법이 작동하지 않는 이유를 설명하기 때문에 question을 확인하십시오. 당신이 [권한 부여]와 모든 보안 컨트롤러 액션에 주석을 이동하면

그래서 사용자 정의 ExceptionFilter이

public class HandleUnauthorizedAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     base.OnException(filterContext); 

     if (filterContext.Exception.GetType() != typeof (SecurityException)) return; 

     var controllerName = (string) filterContext.RouteData.Values["controller"]; 
     var actionName = (string) filterContext.RouteData.Values["action"]; 
     var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName); 

     filterContext.Result = new ViewResult 
     { 
      ViewName = "Unauthorized", 
      ViewData = new ViewDataDictionary<HandleErrorInfo>(model), 
      TempData = filterContext.Controller.TempData 
     }; 
     filterContext.ExceptionHandled = true; 
     filterContext.HttpContext.Response.Clear(); 
     filterContext.HttpContext.Response.StatusCode = 403; 
     filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
    } 
} 

같은

을 추가 할 수 있습니다 다음

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleUnauthorizedAttribute()); 
    } 
} 
+0

이 경우에도 적용됩니까? 'YouShallNotPass.html'는 정적 인 HTML 파일입니다. 그것은 컨트롤러에 의해 제공되지 않습니다. – Amy

+0

웹에서 보안을 구성 할 수 없다는 것이 핵심입니다.config를 사용하면 전체 사이트를 잠근 다음 asp.net 웹 폼과 마찬가지로 으로 구멍을 열 수 있습니다. 그래서 1. 컨트롤러 동작에 authorize 속성을 사용하십시오. 2. 모든 것을 잠그지 않기 때문에 1을 수행 한 후에 그 customerror를 사용할 수 있습니다. – Fran

+0

다른 하나의 문제는 인증 (사용자)과 인증 (할 수있는 것)을 섞어 사용한다는 것입니다. 인증 오류는 401이 될 것입니다. 권한 오류는 403. – Fran

1

여기까지 배선 내 global.asax에 다음을 추가하여이 문제를 해결할 수있었습니다.

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    if (Response.StatusCode != 401) 
     return; 

    Response.ClearContent(); 
    Response.WriteFile("~/ui/Other/YouShallNotPass.html"); 
    Response.ContentType = "text/html"; 
} 

그래도이 작업을 수행하려면 web.config를 사용하는 것이 좋습니다.

+0

당신이 당신의 메인의 Web.config에''요소를 사용하는 대신 두 번째의 Web.config을 가지고 시도해 봤어? 그것은 응답을 가로 챌 필요없이보다 깨끗한 대안 일 수 있습니다. – mason

+0

예. 그래도 지금은 효과가 없었던 이유를 기억하지 못합니다. – Amy