Ответ 1
Я понял это. Я получал сообщение JSON, когда был указан класс LoginPath для OwinStartup.
Я встаю, чтобы ускорить идентификацию 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 раньше, если ему было отказано?
Я понял это. Я получал сообщение JSON, когда был указан класс LoginPath для OwinStartup.
статья, упомянутая выше, верна, однако я думаю, что она не охватывает случай, когда 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");
}