재우니의 블로그

asp.net mvc 개발하면서 controller , web api 를 둘 다 동일한 환경에서 사용한다는 가정하에, 해당 controller 나 web api 를 호출할 때 인증 없이 접근 할 경우, [Authorize] 의 attribute 를 사용해서 redirect 로 비인증자에게 로그인 인증 화면으로 화면 전환을 합니다. UseCookieAuthentication 인증을 사용하신다면, 이는  onApplyRedirect() 함수를 통해 간단히 해결이 되지요.

아래의 코딩 구문대로, 비인증자가 호출하면 IsApiRequest() 함수를 통해 controller 인지 web api 인지 체크하며, web api 에서 호출한 것이라고 판단할 경우  아래와 같이 401 상태코드를 반환과 동시에, 에러 메시지도 제공해 드립니다.

{
    "Message": "이 요청에 대한 권한 부여가 거부되었습니다."
}

https://stackoverflow.com/a/28713392

 

Unauthorised webapi call returning login page rather than 401

How do I configure my mvc/webapi project so that a webapi method called from a razor view doesn't return the loginpage when its unauthorised? Its a MVC5 application which also has WebApi controlle...

stackoverflow.com

public void ConfigureAuth(IAppBuilder app)
{
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/Account/Login"),
        Provider = new CookieAuthenticationProvider()
        {
            OnApplyRedirect = ctx =>
            {
                if (!IsApiRequest(ctx.Request))
                {
                    ctx.Response.Redirect(ctx.RedirectUri);
                }
            }
        }
    });

    app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
}


private static bool IsApiRequest(IOwinRequest request)
{
    string apiPath = VirtualPathUtility.ToAbsolute("~/api/");
    return request.Uri.LocalPath.StartsWith(apiPath);
}