Сделать аутентификацию веб-API 401 вместо перенаправления на страницу входа

У меня есть веб-API с аутентификацией OWIN в веб-MVC. Я использую <authentication>в Интернете. < authentication mode = "Forms" > < forms name = "WEB.AUTH" loginUrl = "~ / login" domain = "" protection = "All" timeout = "43200" path = "/" requireSSL = "false" slideExpiration = «true» /> </ authentication > для моего веб-MVC, поэтому он перенаправляется на страницу входа.

[System.Web.Http.Authorize]

Я использую Startup.csатрибут для авторизации моего веб-API. Но почему-то API переадресовывает страницу входа в систему так же, как мое приложение MVC из-за вышеуказанной конфигурации.

то, что я хочу сделать, это сохранить функцию перенаправления для веб-MVC, но возвращает 401 для веб-API. Как я могу это достичь? должен ли я создать настраиваемый атрибут авторизации для веб-API?

--РЕДАКТИРОВАТЬ--

Я нашел ответ из этого сообщения. SuppressDefaultHostAuthentication в WebApi.Owin также подавляет аутентификацию вне webapi

Поэтому я просто добавляю несколько строк . У меня были все мои контроллеры, настроенные с помощью префикса «api».HttpConfiguration config = new HttpConfiguration(); //..some OWIN configuration app.Map("/api", inner => { inner.UseWebApi(config); });

app.Map()

убедитесь, что вы разместили AuthorizeAttributeстроки конфигурации Web Api. В противном случае это приведет к ошибке для приложения MVC.

c#,asp.net,asp.net-mvc,authentication,asp.net-web-api,

11

Ответов: 4


1

Создайте обычай :public class MyAuthorizeAttribute : AuthorizeAttribute { protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) { actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Unauthorized"); } }

Startup.cs

Если вы в будущем пропустите материал web.config и используете owin для настройки вашей аутентификации, вы можете в своем сделать:var provider = new CookieAuthenticationProvider(); var originalHandler = provider.OnApplyRedirect; provider.OnApplyRedirect = context => { if (!context.Request.Uri.LocalPath.StartsWith(VirtualPathUtility.ToAbsolute("~/api"))) { context.RedirectUri = new Uri(context.RedirectUri).PathAndQuery; originalHandler.Invoke(context); } }; app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, CookieName = FormsAuthentication.FormsCookieName, LoginPath = new PathString("/Account/LogOn"), ExpireTimeSpan = TimeSpan.FromMinutes(240), Provider = provider });

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class NoRedirectAuthorizeAttribute : AuthorizeAttribute
{        
    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
    {
        actionContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Forbidden);
    }
}

0

Это то, что сработало для меня.

Создание настраиваемого атрибута:

    [HttpDelete]
    [NoRedirectAuthorizeAttribute(Roles = "Admin")]
    [Route("api/v3/thingstodelete/{id=id}")]
    public IHttpActionResult DeleteThingToDelete(Guid id)
    {
      //delete code
    }

Использование атрибута в вашем контроллере:

IApplicationBuilder.Map

Здесь просто переопределяется метод HandleUnauthorizedRequest атрибута AuthorizeAttribute . Таким образом, вместо отправки перенаправления (304) на страницу входа, мы отправляем код статуса HTTP с запретом (403).


0

Чтобы изменить поведение IIS на основе соглашения, определенного URL-адресом, вы хотите разветвить конвейер OWIN. Вы можете сделать это, используя config. Предполагая статичность config:

public void Configure(IApplicationBuilder app)
{
    ...
    app.Map("/api", HandleWebApiRequests);
    ...
}

private static void HandleWebApiRequests(IApplicationBuilder app)
{
    app.UseWebApi(config);
}

В Mapметоде ветви трубопровода к HandleWebApiRequestsметоду , основанному на URL , который начинается с "/api".

Это должно приводить к ошибкам 401, которые, как предполагается, должны просто возвращаться 401 без перенаправления.


0

Мне нужно было настроить промежуточное программное обеспечение StatusCodePage, чтобы избежать перенаправления

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ...
    app.UseStatusCodePages();
    ...
}
C #, asp.net, asp.net-MVC, аутентификация, asp.net-веб-апи,
Похожие вопросы