Веб-API, размещенный в OWIN: используется проверка подлинности Windows и разрешение анонимного доступа. - PullRequest
1 голос
/ 26 апреля 2019

У меня есть WebApi проект, размещенный самостоятельно с использованием OWIN.

Я хочу включить проверку подлинности Windows для некоторых действий контроллера, но разрешить анонимный вызов других действий.

Итак, следуя некоторым примерам, которые я нашел в Интернете, я настроил свой WebApi следующим образом в своем классе Statrup:

public void Configuration(IAppBuilder appBuilder)
{
    HttpListener listener = (HttpListener)appBuilder.Properties["System.Net.HttpListener"];
    listener.AuthenticationSchemes = AuthenticationSchemes.IntegratedWindowsAuthentication | AuthenticationSchemes.Anonymous; //Allow both WinAuth and anonymous auth

    //setup routes and other stuff
    //...

    //Confirm configuration
    appBuilder.UseWebApi(config);
}

Затем в своем контроллере я создал два действия:

[HttpGet]
[Authorize]
public HttpResponseMessage ProtectedAction()
{
    //do stuff...
}

[HttpGet]
[AllowAnonymous]
public HttpResponseMessage PublicAction()
{
    //do stuff...
}

Это, однако, не работает. Вызов действия, помеченного AllowAnonymous, работает как положено, но вызов действия, помеченного Authorize, всегда возвращает ошибку 401 и следующее сообщение:

{
    "Message": "Authorization has been denied for this request."
}

, даже если звонящий поддерживает проверку подлинности Windows, протестирован в браузерах (Chrome и Edge) и Postman.

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 26 апреля 2019

Поскольку ваше описание вопроса немного ограничено, я настроил демонстрационное приложение, в котором я реализовал OAuthAuthorizationServerProvider в качестве поставщика для OAuthAuthorizationServerOptions и переопределил GrantResourceOwnerCredentials и ValidateClientAuthentication

  public void Configuration(IAppBuilder app)
    {
        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
        {
            Provider = new ApplicationOAuthBearerAuthenticationProvider()
        });
        app.Use<AuthenticationResponseMiddleware>();
        var options = new OAuthAuthorizationServerOptions
        {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/api/xxxx"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), 
            Provider = new OwinAuthorisationProvider()

        };
        app.UseOAuthAuthorizationServer(options);

    }

также попытался создать пользовательский AuthorizeAttribute и добавил его в качестве фильтров в классе конфигурации .Filters.Add(new AuthorizeAttribute());

В AuthenticationResponseMiddleware я унаследовал OwinMiddleware, а в методе public override async Task Invoke(IOwinContext context) проверьте поток запроса.

Сначала он получает OAuthBearerAuthenticationProvider сначала в методе RequestToken, затем в классе OwinMiddleware, прежде чем перейти на любой DelegatingHandler конвейер, в основном на этом уровне реализована ваша аутентификация.

Пожалуйста, прокомментируйте свои выводы после этой проверки, параллельно я тоже изменяю API и обновляю вас, надеюсь, он вам поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...