2010-01-26 8 views
4

J'utilise ASP.NET MVC 1.1 avec l'authentification Windows. J'essaie d'autoriser seulement les membres d'un groupe et moi-même. Je ne suis pas membre du groupe et je n'aurais pas besoin d'être membre de ce groupe. J'obtiens l'invite de connexion/mot de passe de Windows chaque fois que j'accède à l'URL de l'application Web. Le HomeController aasp.net mvc [Authorize()] attribut pour groupe mixte et utilisateur

[HandleError] 
[Authorize([email protected]"MyDomain\\company.security.group.name")] 
[Authorize([email protected]"MyDoamin\\MyName")] 
[OutputCache(Duration=86400,VaryByParam="PageIndex")] 
public class HomeController : Controller 

Comment activer une telle autorisation? L'application Web s'exécute sous un site sur IIS6. Le site a la sécurité d'annuaire pour accepter anonyme. L'application Web/le répertoire virtuel est désactivé et la sécurité intégrée de Windows est activée. Le web.config a

Répondre

11

Vous pouvez sous-type AuthorizeAttribute pour regarder Utilisateurs et Rôles. du haut de ma tête (non testé):

using System; 
using System.Linq; 
using System.Security.Principal; 
using System.Web; 
using System.Web.Mvc; 

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    // This method must be thread-safe since it is called by the thread-safe OnCacheAuthorization() method. 
    protected override bool AuthorizeCore(HttpContextBase httpContext) { 
     base.AuthorizeCore(httpContext); 

     if ((!string.IsNullOrEmpty(Users) && (_usersSplit.Length == 0)) || 
      (!string.IsNullOrEmpty(Roles) && (_rolesSplit.Length == 0))) 
     { 
      // wish base._usersSplit were protected instead of private... 
      InitializeSplits();     
     } 

     IPrincipal user = httpContext.User; 
     if (!user.Identity.IsAuthenticated) { 
      return false; 
     } 

     var userRequired = _usersSplit.Length > 0; 
     var userValid = userRequired 
      && _usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase); 

     var roleRequired = _rolesSplit.Length > 0; 
     var roleValid = (roleRequired) 
      && _rolesSplit.Any(user.IsInRole); 

     var userOrRoleRequired = userRequired || roleRequired; 

     return (!userOrRoleRequired) || userValid || roleValid; 
    } 

    private string[] _rolesSplit = new string[0]; 
    private string[] _usersSplit = new string[0]; 

    private void InitializeSplits() 
    { 
     lock(this) 
     { 
      if ((_rolesSplit.Length == 0) || (_usersSplit.Length == 0)) 
      { 
       _rolesSplit = Roles.Split(','); 
       _usersSplit = Users.Split(','); 
      } 
     } 
    } 
} 
+0

Il manque quelque chose dans le code d'attribut personnalisé affiché. J'ai réussi à déboguer et compilé. Ça n'a pas marché. Voici la déclaration d'attribut. [MyAuthorize (Roles = @ "MyDomain \\ company.security.group.name", Users = @ "MyDoamin \\ MyName"))] – user266909

+0

Pouvez-vous élaborer sur "n'a pas fonctionné", s'il vous plaît? –

+2

Je sais que c'est un vieux message, mais ce que vous semblez avoir manqué, c'est que '@' élimine le besoin d'échapper vos barres obliques inverses. Lorsque vous faites les deux, vous créez un littéral de chaîne qui contient deux barres obliques inverses, au lieu de la barre oblique unique dont vous avez besoin. –

12

Comme vous préfixant votre domaine/utilisateur et les chaînes domaine/groupe avec le caractère « @ » vous ne devez échapper à la barre oblique inverse. Vous pouvez essayer de remplacer ces lignes soit:

[Authorize(Roles="MyDomain\\company.security.group.name")] 
[Authorize(Users="MyDoamin\\MyName")] 

ou

[Authorize([email protected]"MyDomain\company.security.group.name")] 
[Authorize([email protected]"MyDoamin\MyName")] 

Un peu de lecture plus a également révélé que le filtre Autorisez effectuera une vérification « utilisateurs » et « rôles ». Si l'utilisateur ne répond pas aux deux exigences, l'accès lui sera refusé.
Pour obtenir le comportement souhaité, vous devez écrire un filtre d'autorisation personnalisé comme suggéré dans une réponse précédente.

Questions connexes