Авторизация заявок с помощью OWIN Self Hosted WebApi

Я сам хостинг 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

Ответы на вопрос(1)

Ваш ответ на вопрос