Я самостоятельно хостинг WebAPI со следующей конфигурацией:Иска Auth с Owin самодостаточно WebAPI
Visual Studio 2012/.NET 4,0
public void Configuration(IAppBuilder appBuilder)
{
var config = new HttpConfiguration();
// authentication
config.MessageHandlers.Add(new Shield.PresharedKeyAuthorizer());
// routing
config.Routes.MapHttpRoute(
name: "Default",
routeTemplate: "{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
appBuilder.UseWebApi(config);
}
У меня есть простая испытательная установка с помощью следующей DelegatingHandler
для создания претензию и прикреплять ее к текущему потоку.
public class PresharedKeyAuthorizer : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, "superstar"));
var identity = new ClaimsIdentity(claims, "PresharedKey");
var principal = new ClaimsPrincipal(identity);
Thread.CurrentPrincipal = principal;
if (HttpContext.Current != null)
HttpContext.Current.User = principal;
return base.SendAsync(request, cancellationToken);
}
}
Однако, когда я попал в ApiController
, помеченный атрибутом Authorize
, он не распознает аутентификацию.
[Authorize]
public class FilesController : ApiController
{
public IEnumerable<string> Get()
{
return new string[] { "Secure File A", "Secure File B" };
}
}
Удаление атрибута Authorize
и установки точки останова, я могу видеть, что RequestContext.Principal свойство действительно нуль. Запрос работает без атрибута Authorize
, поэтому я знаю, что настройка собственного хостинга верна, но я должен что-то пропускать в конвейере аутентификации.
Что мне не хватает, чтобы разрешить эту претензию работать с атрибутом Authorize
?
Это родственный ответ с таким же подходом, как представляется, работать при размещении на IIS: https://stackoverflow.com/a/14872968/118224
Доступно ли это только в WebApi 2.0? Я запускаю .Net4.0/VS2012, который я добавлю к своему ответу. –
Да, но разве вы уже не используете веб-API 2? Я думал, что вы проверяете 'Principal' на' HttpRequestContext'. – Badri
Правильно, я использую webapi2. Я на самом деле использую AuthorizeAttribute на контроллере, который должен проверять Текущий поток. –