2011-09-30 3 views
0

MVC2 응용 프로그램에서 대부분의 요청에 양식 인증을 사용하고 특정 URI에 대한 요청을 통해 사용자 지정 인증을 사용하고자합니다. 이렇게하려면 FormsAuthentication_OnAuthenticate() 메서드를 추가하고 URI를 확인한 다음 요청 헤더에서 사용자 이름과 암호를 확인하려는 배타적 URI 중 하나인지 확인하십시오.MVC에서 사용자 정의 인증을 구현할 때 요청 처리를 어떻게 종료합니까?

제공된 자격 증명이 잘못되면 요청을 종료하는 방법에 문제가 있습니다.

내가 시도 :

HttpContext context = args.Context; 

context.Response.Write("Wrong credentials"); 
context.Response.StatusCode = 401; 
context.Response.End(); 

을하지만 그렇게되면 요청은 제가 요청을 종료 할

<authentication mode="Forms"> 
     <forms loginUrl="~/LogOn"/> 
</authentication> 

에서의 web.config에 지정된 URI로 전달됩니다 - 그래서 응답이 클라이언트로 전송되고 연결이 닫힙니다. 어떻게해야합니까?

답변

1

401 상태 코드를 보내면 양식 인증 모듈이이 코드를 가로 채고 자동으로 로그온 페이지로 리디렉션합니다. ASP.NET MVC에서 인증을 처리하는 올바른 방법은 [Authorize] 속성을 사용하는 것입니다.

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new ViewResult 
     { 
      ViewName = "~/Views/Shared/unauthorized.cshtml" 
     }; 
    } 
} 

UPDATE : 또한

그리고 당신은 그것이 HandleUnauthorizedRequest 방법을 로그인 페이지로 리디렉션 대신 사용자 지정 권한 부여 속성을 쓸 수있는 몇 가지보기를 표시하고 무시하지 않으려면 HandleUnauthorizedRequest을 재정의하려면 사용자 지정 인증을 수행 할 수있는 AuthorizeCore 메서드를 재정의 할 수 있습니다.

+0

보기로 리디렉션하고 싶지 않습니다. 이러한 주소는 프로그래밍 방식의 요청을위한 것이므로 일부 미리 정의 된 문자열을 응답에 제공하고 닫아야합니다. 따라서 Forms Auth 모듈에 대한 차단을 원하지 않습니다. – sharptooth

+0

@sharptooth 만약 당신이보기로 리다이렉트하고 싶지 않다면, 빈 결과 나 클라이언트가 기대하는 것만 반환하면됩니다 :'filterContext.Result = new EmptyResult();' –

+0

그래,하지만이 방법으로 나의 커스텀 인증을 어떻게 호출 할까? ? – sharptooth

0

응용 프로그램을 보호하는 더 쉬운 방법은 PrincipalPermissionAttribute을 사용하는 것입니다.이 방법을 전체 컨트롤러에 적용하거나 컨트롤러의 작업에만 적용 할 수 있습니다. 예 :

[PrincipalPermission(SecurityAction.Demand, Role="Administrator")] public class AdminController : Controller { ... }

또는

[PrincipalPermission(SecurityAction.Demand, Role="Administrator")] public ActionResult DeleteUser(int id) { ... }

을 좀 더 정보 in this article를 찾을 수 있습니다.

+0

주석을 읽으면 PrincipalPermssion이 CodeSecurity를 ​​사용하지 않기 때문에 이것이 실제로 좋지 않음을 알 수 있습니다. 좀 더 낮은 수준이며 다른 것들을 구현해야합니다. –

관련 문제