Autenticación de reclamaciones con OWIN Self Hosted WebApi
Estoy auto hospedando WebApi con la siguiente configuración:
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);
}
Tengo una configuración de prueba simple con el siguienteDelegatingHandler
para crear un reclamo y adjuntarlo al hilo actual.
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);
}
}
Sin embargo, cuando golpeo elApiController
que está marcado con elAuthorize
Atributo, no reconoce la autenticación.
[Authorize]
public class FilesController : ApiController
{
public IEnumerable<string> Get()
{
return new string[] { "Secure File A", "Secure File B" };
}
}
La eliminación de laAuthorize
atributo y establecer un punto de interrupción, puedo ver que la propiedad RequestContext.Principal es de hecho nula. La solicitud funciona aleta sin laAuthorize
atributo, por lo que sé que la configuración del auto hosting es correcta, pero debo faltar algo en la tubería de autenticación.
¿Qué me estoy perdiendo para permitir que esa reclamación trabaje contra elAuthorize
¿atributo?
Esta respuesta relacionada con el mismo enfoque parece funcionar cuando está alojada por IIS:https://stackoverflow.com/a/14872968/118224