Owin Self-Host WebApi Windows аутентификация и анонимность

У меня есть собственный хостинг Owin WebAPI. Я хочу защитить несколько маршрутов с помощью аутентификации. Большинство маршрутов должны быть доступны анонимно. Я успешно реализовал Windows-Auth, но теперь я получаю 401 - Unauthorized при попытке доступа к маршрутам, отмеченным [AllowAnonymous] при доступе к ним анонимно. Если я вызываю метод с действительными учетными данными, все работает нормально.

Идеальным решением было бы разрешить анонимный доступ по умолчанию и требовать учетные данные только тогда, когда действие имеет [Authorize] приписывать.

Owin config

public void Configuration(IAppBuilder appBuilder)
{
    // Enable Windows Authentification
    HttpListener listener = (HttpListener)appBuilder.Properties["System.Net.HttpListener"];
    listener.AuthenticationSchemes = AuthenticationSchemes.IntegratedWindowsAuthentication;

    HttpConfiguration config = new HttpConfiguration();
    config.MapHttpAttributeRoutes();

    appBuilder.Use(typeof(WinAuthMiddleware));
    appBuilder.UseWebApi(config);
}

WinAuth OwinMiddleware

public class WinAuthMiddleware : OwinMiddleware
{
    public WinAuthMiddleware(OwinMiddleware next) : base(next) {}
    public async override Task Invoke(IOwinContext context)
    {
        WindowsPrincipal user = context.Request.User as WindowsPrincipal;
        //..
    }
}

Пример Действие

public class ValuesController : ApiController
{      
    [AllowAnonymous] // attribute gets ignored
    [Route("Demo")]
    [HttpGet]
    public string Get()
    {
        //..
    }
}

1 ответ

Решение

Ваша проблема в том, что вы настроили HttpListener для поддержки только аутентификации Windows. Это похоже на настройку сайта IIS только с проверкой подлинности Windows: каждый запрос к сайту должен проходить через проверку подлинности Windows.

Чтобы выборочно активировать аутентификацию, вам нужно разрешить как аутентификацию Windows, так и анонимную аутентификацию, изменив конфигурацию на эту

public void Configuration(IAppBuilder appBuilder)
{
    // Enable Windows Authentification and Anonymous authentication
    HttpListener listener = 
    (HttpListener)appBuilder.Properties["System.Net.HttpListener"];
    listener.AuthenticationSchemes = 
    AuthenticationSchemes.IntegratedWindowsAuthentication | 
    AuthenticationSchemes.Anonymous;

    HttpConfiguration config = new HttpConfiguration();
    config.MapHttpAttributeRoutes();

    appBuilder.Use(typeof(WinAuthMiddleware));
    appBuilder.UseWebApi(config);
}

Сделайте это, и ваши стандартные теги [Authorize] и [AllowAnymous] начнут работать как положено.

Другие вопросы по тегам