양식 인증을 우회하여 로그인으로 자동 리디렉션하는 방법은 무엇입니까?

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

문제

iis6에 배포하는 asp.net-mvc를 사용하여 앱을 작성 중입니다.양식 인증을 사용하고 있습니다.일반적으로 사용자가 적절한 인증 없이 리소스에 액세스하려고 하면 로그인 페이지로 리디렉션되기를 원합니다.FormsAuth는 이 작업을 충분히 쉽게 수행합니다.

문제:이제 콘솔 앱에서 작업에 액세스하고 있습니다.요청을 로그인 페이지로 리디렉션하는 대신 이 작업이 상태 401로 응답하도록 하는 가장 빠른 방법은 무엇입니까?

콘솔 앱이 투명해지는 대신 이 401 StatusCode에 반응할 수 있기를 바랍니다.또한 기본값을 유지하고 무단 요청을 로그인 페이지 동작으로 리디렉션하고 싶습니다.

메모:테스트로 이것을 global.asax에 추가했는데 양식 인증을 우회하지 않았습니다.

protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
    HttpContext.Current.SkipAuthorization = true;
}

@데일과 앤디

MVC 미리보기 4에 제공된 AuthorizeAttributeFilter를 사용하고 있습니다.이는 HttpUnauthorizedResult를 반환합니다.이 결과는 statusCode를 401로 올바르게 설정하는 것입니다.내가 이해하는 문제는 asp.net이 응답을 가로채서(401로 태그가 지정되었기 때문에) 그냥 통과시키는 대신 로그인 페이지로 리디렉션한다는 것입니다.특정 URL에 대한 차단을 우회하고 싶습니다.

도움이 되었습니까?

해결책

좋아, 이 문제를 해결했습니다.저는 사용자 정의 ActionResult(HttpForbiddenResult)와 사용자 정의 ActionFilter(NoFallBackAuthorize)를 만들었습니다.

리디렉션을 방지하기 위해 HttpForbiddenResult는 상태 코드 403으로 응답을 표시합니다.FormsAuthentication은 이 코드로 응답을 포착하지 못하므로 로그인 리디렉션을 효과적으로 건너뜁니다.NoFallBackAuthorize 필터는 포함된 Authorize 필터와 마찬가지로 사용자에게 권한이 부여되었는지 확인합니다.액세스가 거부되면 HttpForbiddenResult를 반환한다는 점에서 다릅니다.

HttpForbiddenResult는 매우 간단합니다.

public class HttpForbiddenResult : ActionResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        context.HttpContext.Response.StatusCode = 0x193; // 403
    }
}

FormsAuthenticationModule에서 로그인 페이지 리디렉션을 건너뛸 수 없는 것 같습니다.

다른 팁

복잡할 수도 있고 작동하지 않을 수도 있지만 로그인 페이지에서 다음 사항을 확인하세요. Request.QueryString["ReturnUrl"] != null 그리고 그렇게 설정되면 Response.StatusCode = 401.

어떻게든 인증하려면 콘솔 앱을 가져와야 한다는 점을 명심하세요.HTTP 기본 인증은 무료로 제공되지 않습니다.직접 굴려야 하지만 구현 방법이 많이 있습니다.

작업에 대한 FormsAuth 속성을 직접 작성하셨나요?그렇다면 OnActionExecuting 메서드에서 FilterExecutingContext를 전달받습니다.이를 사용하여 401 코드를 다시 전달할 수 있습니다.

public class FormsAuth : ActionFilterAttribute
{
    public override void OnActionExecuting(FilterExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.StatusCode = 401;
        filterContext.Cancel = true;
    }
}

이것은 작동합니다.FormsAuth 속성을 작성했는지 아니면 다른 곳에서 가져온 것인지 확실하지 않습니다.

아직 Preview 4에 제공되는 AuthorizeAttribute를 사용하지 않았습니다.나는 첫 번째 CTP 이후 MVC 프레임워크를 사용해 왔기 때문에 직접 굴렸습니다.리플렉터의 속성을 잠깐 살펴보았는데 401에 해당하는 16진수를 사용한다는 점을 제외하면 내부적으로 위에서 언급한 작업을 수행하고 있습니다.예외가 발생한 위치를 확인하려면 호출을 더 자세히 조사해야 합니다. 왜냐하면 예외가 리디렉션을 수행하는 위치일 가능성이 높기 때문입니다.이는 재정의해야 할 기능입니다.아직 할 수 있는지 잘 모르겠지만, Haacked가 이것을 보고 직접 게시하지 않는 한, 그것을 찾으면 다시 게시하고 해결 방법을 제공할 것입니다.

구글링을 좀 해서 알아낸 결과는 다음과 같습니다.


    HttpContext.Current.Response.StatusCode = 401;

작동하는지 여부는 확실하지 않으며 테스트해 보지 않았습니다.어느 쪽이든 시도해 볼 가치가 있지 않습니까?:)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top