Идентификация Asp.Net: запрос веб-Api завершает авторизацию, возвращает 200 OK

Я встаю, чтобы ускорить идентификацию Asp.Net в .NET 4.5. Я настраиваю тестовое приложение, которое регистрирует, регистрируется и пытается совершить вызов Api Controller, для которого требуется требование "Admin":

[Authorize(Roles="Admin")]
public class WorkController : ApiController

Когда делается запрос, который не имеет претензии "Admin", веб-Api по-прежнему возвращает 200-OK, но с JSON: {Message:"Authorization has been denied for this request."}

Это кажется мне немного странным, поскольку это не представляет собой успешный запрос. Я ожидал ошибку 401. У меня возникли проблемы с поиском информации о том, как настроить ответ, или вернуть правильный код состояния. Думаю, я должен спросить, подходит ли 401 для этого, или же это код правильного статуса 200, и я должен просто справиться с этим?

edit: По какой-то причине он теперь возвращает 401. Теперь я не понимаю, почему я получал сообщение JSON раньше, если ему было отказано?

Ответ 1

Я понял это. Я получал сообщение JSON, когда был указан класс LoginPath для OwinStartup.

Ответ 2

статья, упомянутая выше, верна, однако я думаю, что она не охватывает случай, когда API вызывается сторонним а не как ajax-запрос (тестовый запрос [ "X-Requested-With" ] и т.д.).

Это мое предпочтение:

в Startup.Configuration() или Startup.ConfigureAuth():

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

private bool IsApiRequest(IOwinRequest request)
{
    return request.Uri.AbsolutePath.StartsWith("/api");
}