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] начнут работать как положено.