est-il possible d'une implémentation de middleware Owin d'ajouter des revendications avant l'exécution d'un contrôleur d'API Web?
Création d'une implémentation OwinMidDleware et a ajouté une identité: p>
var id = new ClaimsIdentity(); id.AddClaim(new Claim("Whatever", "is possible")); context.Authentication.User.AddIdentity(id); await Next.Invoke(context);
3 Réponses :
Vous pouvez trouver utile hériter de l'attribut Autorisate et l'étendre à vos besoins: et dans votre contrôleur: p> [DemoAuthorize]
public class ValuesController : ApiController{
Seul le problème que j'ai trouvé avec ceci est si vous prenez en charge plusieurs méthodes d'autorisation par exemple. OAuth et HMAC Vous devez mettre en œuvre l'enrichissement des sinistres dans plusieurs endroits, d'où ma réponse ci-dessous.
Il existe déjà une classe qui peut fournir des réclamations d'enrichissement revendicationAuthenticationManager, que vous pouvez étendre afin qu'il gère vos revendications spécifiques à un domaine, par exemple ... la tâche suivante consiste à fournir le middleware approprié invoquer cela. Pour mes projets, j'ai écrit les classes suivantes ... p> , puis une extension de câblage ... p> Je sais que c'est le localisateur de service Anti-motif, mais à l'aide d'IServiceProvider est neutre du conteneur et semble être le moyen accepté de mettre les dépendances dans le middleware Owin. P> Enfin, vous devez le faire filer dans votre démarrage, votre exemple ci-dessous. Présume l'unité et l'enregistrement / exposition d'une propriété IServiceLocator ... p> // Owin config
app.UseClaimsTransformation(UnityConfig.ServiceLocator);
Voici comment j'ai fini par ajouter une nouvelle réclamation dans Owin Middleware, sur la base du commentaire de l'OP sur l'accrochage dans UseOauthBerAuthentication. Il utilise IdentityServer.Accesstokenvalidation, qui appelle UseoauthberArentication en interne et transmet l'oauthbeereraThenticationProvider à ce sujet.
using System.Security.Claims; using System.Threading.Tasks; using IdentityServer3.AccessTokenValidation; using Owin; using Microsoft.Owin.Security.OAuth; //... public void Configuration(IAppBuilder app) { app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions { Authority = "http://127.0.0.1/identityserver", TokenProvider = new OAuthBearerAuthenticationProvider { OnValidateIdentity = AddClaim } }); } private Task AddClaim(OAuthValidateIdentityContext context) { context.Ticket.Identity.AddClaim(new Claim("test", "123")); return Task.CompletedTask; }
Après une conversation avec @PinPoint sur le lobby Owin dans Jabbr, il apparaît que la seule façon de passer à la ligne d'authentification est via l'utilisation de l'utiloauthéthère IAPPBuilder en spécifiant un fournisseur personnalisé. Les revendications peuvent ensuite être ajoutées dans le contexte d'identité (context.ticket.entity.addClaim (...)). Ceci est fait par demande.