Jest już klasa, która może dostarczyć roszczeniom wzbogacania ClaimsAuthenticationManager, które można rozszerzyć tak, że obsługuje swoich roszczeń specyficznych domen, na przykład ...
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;
}
}
Następny zadaniem jest zapewnienie odpowiedniej warstwy pośredniej do powoływania się na to. Dla moich projektów Pisałem następujących klas ...
/// <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);
}
}
a następnie rozszerzenie przewodów ...
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;
}
}
wiem, że to jest usługa lokalizatora anty-wzorzec, ale stosując IServiceProvider pojemnik jest neutralny i wydaje się być akceptowanym sposobem umieszczania zależności w oprogramowaniu Owin.
Ostatni trzeba podłączyć ten w swoim starcie, przykład poniżej zakłada jedność i Rejestrowanie/wystawiając nieruchomość IServiceLocator ...
// Owin config
app.UseClaimsTransformation(UnityConfig.ServiceLocator);
Po rozmowie z @Pinpoint na holu Owin w JabbR wydaje się, że jedynym sposobem na linii uwierzytelniania jest przez UseOAuthBearerAuthentication w IAppBuilder przez określenie dostawcy niestandardowego. Roszczenia można następnie dodać do kontekstu tożsamości (context.Ticket.Identity.AddClaim (...)). Odbywa się to na żądanie. –