2016-11-28 2 views
1

J'ai un projet WebAPI dans lequel j'ai besoin d'utiliser l'authentification Windows pour les utilisateurs, mais implémenter un fournisseur de rôles personnalisé pour les attributs Authorize au-dessus des routes. Lorsque je l'implémente cependant, j'obtiens toujours {"Message": "L'autorisation a été refusée pour cette requête."} Comme résultat de mon appel. De plus, aucun de mes points d'arrêt déclenche jamais sauf celle du constructeur du fournisseur de rôles personnaliséRègleProvider personnalisée avec l'authentification Windows dans l'API Web

Contrôleur

[Authorize(Roles="Administrator")] 
[RoutePrefix("api/Constituents")] 
public class ConstituentsController : ApiController 
{ 
[Route("Constituents")] 
    [HttpGet] 
    public IDataResponse<List<IConstituent>> GetConstituents() 
    { 
     return service.GetConstituent(); 
    } 

personnalisé Rôle Fournisseur

public class CustomRoleProvider : RoleProvider 
{ 
    public CustomRoleProvider() 
    { 
     this.UserRepo = new UserRepository(); //Breakpoint here triggers 
     this.RoleRepo = new RoleRepository(); 
    } 
    public override string[] GetRolesForUser(string username) 
    { 
     var roles = UserRepo.GetUser(username)?.Roles?.Select(r => r.Name).ToArray(); 
     return roles; 
    } 
    public override bool IsUserInRole(string username, string roleName) 
    { 
     var user = UserRepo.GetUser(username); 
     return user.Roles.Select(r => r.Name).Contains(roleName); 
    } 

Web Config

<authentication mode="Windows"/> 
    <roleManager cacheRolesInCookie="false" 
     defaultProvider="CustomRoleProvider" 
     enabled="true"> 
<providers> 
    <clear /> 
    <add name="CustomRoleProvider" 
     type="Data.CustomRoleProvider, Data" /> 
</providers> 

De quelle pièce de puzzle ai-je besoin? J'ai besoin d'obtenir l'utilisateur actuel faisant la demande et ensuite vérifier pour avoir le rôle approprié dans la base de données.

Merci

Répondre

3

Par défaut, Visual Studio définit la propriété authentification Windows sur votre projet sur Désactivé. Dans le volet Propriétés (pas l'onglet), vous devez basculer la propriété sur Activé. Cela devrait vous permettre d'atteindre les points d'arrêt sur votre RoleProvider.

Setting Windows Authentication Property in Visual Studio

Lorsque vous mettez votre application sur un serveur, vous pouvez avoir à exécuter un processus similaire dans IIS pour activer l'authentification Windows et désactiver l'authentification anonyme.