Es gibt bereits eine Klasse, die Ansprüche Anreicherung ClaimsAuthenticationManager zur Verfügung stellen kann, was Sie es Ihre domänenspezifische Ansprüche erweitern können so behandelt, zum Beispiel ...
public class MyClaimsAuthenticationManager : ClaimsAuthenticationManager
{
public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal)
{
if (!incomingPrincipal.Identity.IsAuthenticated)
{
return base.Authenticate(resourceName, incomingPrincipal);
}
return AddApplicationClaims(incomingPrincipal);
}
private ClaimsPrincipal AddApplicationClaims(ClaimsPrincipal principal)
{
// TODO: Add custom claims here based on current principal.
return principal;
}
}
nächste Aufgabe ist es angemessen Middleware zu schaffen, diese aufzurufen. Für meine Projekte habe ich die folgenden Klassen geschrieben ...
/// <summary>
/// Middleware component to apply claims transformation to current context
/// </summary>
public class ClaimsTransformationMiddleware
{
private readonly Func<IDictionary<string, object>, Task> next;
private readonly IServiceProvider serviceProvider;
public ClaimsTransformationMiddleware(Func<IDictionary<string, object>, Task> next, IServiceProvider serviceProvider)
{
this.next = next;
this.serviceProvider = serviceProvider;
}
public async Task Invoke(IDictionary<string, object> env)
{
// Use Katana's OWIN abstractions
var context = new OwinContext(env);
if (context.Authentication != null && context.Authentication.User != null)
{
var manager = serviceProvider.GetService<ClaimsAuthenticationManager>();
context.Authentication.User = manager.Authenticate(context.Request.Uri.AbsoluteUri, context.Authentication.User);
}
await next(env);
}
}
Und dann eine Beschaltungsleitung ...
public static class AppBuilderExtensions
{
/// <summary>
/// Add claims transformation using <see cref="ClaimsTransformationMiddleware" /> any depdendency resolution is done via IoC
/// </summary>
/// <param name="app"></param>
/// <param name="serviceProvider"></param>
/// <returns></returns>
public static IAppBuilder UseClaimsTransformation(this IAppBuilder app, IServiceProvider serviceProvider)
{
app.Use<ClaimsTransformationMiddleware>(serviceProvider);
return app;
}
}
Ich weiß, dass dieser Service Locator anti-Muster ist aber IServiceProvider ist mit Container neutral und scheint der akzeptierte Weg zu sein, Abhängigkeiten in Owin Middleware zu setzen.
Lesen Sie diese nach oben in Ihrem Startup verdrahten müssen, folgendes Beispiel setzt voraus, Unity und Registrierung/Aussetzen eine IServiceLocator Eigenschaft ...
// Owin config
app.UseClaimsTransformation(UnityConfig.ServiceLocator);
Nach einem Gespräch mit @Pinpoint auf der Owin Lobby in JabbR scheint es, dass der einzige Weg in die Authentifizierungs-Linie durch die UseOAuthBearerAuthentication des IAppBuilder ist durch einen speziellen Provider angeben. Ansprüche können dann dem Identitätskontext hinzugefügt werden (context.Ticket.Identity.AddClaim (...)). Dies geschieht auf Anfrage. –