2017-05-17 9 views
1

Je souhaite ajouter une revendication de rôle à un utilisateur Windows déjà authentifié. Ma première approche naïve consistait à ajouter la revendication de rôle à l'intérieur d'un middleware personnalisé owin qui s'exécute avant WebApi. Comme ceci:Asp.Net WebApi 2: Ajouter une revendication de rôle à WindowsIdentity

public class IdentityMiddleware : OwinMiddleware 
{ 
    public IdentityMiddleware(OwinMiddleware next) : base(next) 
    { 
    } 

    public async override Task Invoke(IOwinContext context) 
    { 
     var user = context.Request.User as WindowsPrincipal; 
     var identity = user.Identity as ClaimsIdentity; 
     identity.AddClaim(new Claim(ClaimTypes.Role, "Admin")); 

     await Next.Invoke(context); 
    } 
} 

Toutefois, lors de la fourniture de l'attribut Autoriser dans le contrôleur comme ceci.

public class TestController : ApiController 
{ 
    [Authorize(Roles = "Admin")] 
    public string Get() 
    { 
     return User.Identity.Name; 
    } 
} 

..Je recevra un .

J'ai remarqué que l'émetteur de la nouvelle réclamation est «autorité locale» au lieu de «autorité antidumping», est-ce la raison?

Répondre

1

Avez-vous essayé cela pour votre attribut authorize:

[Authorize(ClaimTypes.Role, "Admin")] 
+0

Merci, mais il n'y a pas de constructeur pour la AuthorizeAttribute dans System.Web.Http, version = 5.2.3.0 – mode777

+1

Si votre problème n'est pas encore résolu, vous pouvez écrire un attribut d'autorisation personnalisé en héritant de System.Web.Mvc.AuthorizeAttribute et vérifier vos revendications 'manuellement' – Verthosa

+0

C'est exactement ce que j'essayais d'éviter mais j'ai fini par faire de toute façon :) – mode777

1

Cela fonctionne pour moi:

var сlaimsIdentity = user.Identity as ClaimsIdentity; 
сlaimsIdentity?.AddClaim(new Claim(сlaimsIdentity.RoleClaimType, "Admin")); 
if (user.IsInRole("Admin")) ... // always true