Ansprüche Auth mit OWIN Self-Hosted WebApi
Ich bin self-hosting-WebApi mit der folgenden Konfiguration:
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);
}
Habe ich einen einfachen test-setup mit den folgenden DelegatingHandler
zu Anspruch und bringen es zu den aktuellen thread.
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);
}
}
Jedoch, wenn ich drücken Sie die ApiController
gekennzeichnet ist, mit der Authorize
Attribut, es nicht erkennt die Authentifizierung.
[Authorize]
public class FilesController : ApiController
{
public IEnumerable<string> Get()
{
return new string[] { "Secure File A", "Secure File B" };
}
}
Entfernen der Authorize
Attribut und setzen Sie einen Haltepunkt kann ich sehen, dass RequestContext.Prinzipielle Eigenschaft ist in der Tat null. Die Anforderung funktioniert fin ohne die Authorize
Attribut, so weiß ich das setup von der self-hosting ist richtig, aber ich muss fehlt etwas in der Authentifizierung pipeline.
Was bin ich, um zu ermöglichen, dass die Forderung gegen die Authorize
Attribut?
Diesem Zusammenhang Antwort mit dem gleichen Ansatz scheint zu funktionieren, wenn die von IIS gehostet wird: https://stackoverflow.com/a/14872968/118224
InformationsquelleAutor Charlie Brown | 2014-01-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der message-handler, stellen die AUFTRAGGEBER, wie dieses.
Nicht verwenden
UPDATE
Es wurde eine Weile her, seit ich gearbeitet habe .NET 4.0/2012/Web-API <2. So kann ich nicht sicher beantworten. Aber mit OWIN-hosting, AUFTRAGGEBER festgelegt werden muss, in der OWIN-Kontext.
OwinHttpRequestContext
setzt sowohlThread.CurrentPrincipal
und dem AUFTRAGGEBER in OWIN Kontext. Durch die Verwendungrequest.GetRequestContext().Principal
, diese Angaben werden von Ihnen versteckt. Um lange Geschichte kurz zu machen, ich glauben wenn Sie, wie einige legen die AUFTRAGGEBER in OWIN Kontext, das wird funktionieren. Nicht sicher, wie Sie Sie tun können, die von web API-message-handler. Man kann das von der OWIN-middleware.Ja, aber Sie sind nicht bereits mit web API 2? Ich dachte, Sie sind die überprüfung
Principal
aufHttpRequestContext
.Ihre richtige, ich bin mit webapi2. Ich bin tatsächlich mit der AuthorizeAttribute auf dem Controller, die die überprüfung der Aktuellen thread-Rektor, glaube ich.
[Authorize]
bekommt Prinzipal-wie diese -IPrincipal user = actionContext.ControllerContext.RequestContext.Principal;
.Dank deiner ersten Antwort ist richtig jetzt arbeiten. Es hat mich einige Zeit zu erkennen, die
[Authorize]
Attribut aus WebApi hat eine andere Implementierung als[Authorize]
kommen aus dem System.Web. Ich brauchte nur ein Verweis auf die richtige. Für die Portabilität ist, werde ich alle drei Werte, so dass es funktioniert unabhängig davon, wo wird es gehostet.InformationsquelleAutor Badri