2009-09-23 7 views

Répondre

4

Vous ne serez pas en mesure de le faire avec la valeur par défaut AuthorizeAttribute. Vous devrez étendre AuthorizeAttribute avec une classe personnalisée qui ajoute le comportement de l'utilisateur. Généralement, il utilise des utilisateurs nommés, mais vous pouvez fournir une alternative. Normalement, si vous fournissez à la fois des utilisateurs et des rôles, l'utilisateur doit figurer dans la liste des utilisateurs et avoir l'un des rôles indiqués.

public class UserOrRoleAuthorizeAttribute : AuthorizeAttribute 
{ 
    public int? SuperUserID { get; set; } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (base.AuthorizeCore(httpContext)) 
     { 
      var userid == ...get id of current user from db... 
      return userid == this.SuperUserID; 
     } 
     return false; 
    } 
} 

Utilisé comme:

[UserOrRoleAuthorize(Roles="Admin",SuperUserID=15)] 
public ActionResult SomeAction() ... 

Notez que vous pouvez également ajouter une certaine façon de specifing où chercher l'id pour cette action, .ie,

Table="Admins",Column="AdminID",MatchProperty="Company",MatchParameter="company" 

puis mettre du code dans l'attribut pour rechercher la valeur dans la table et la colonne de propriétés et la comparer à l'entrée RouteValue spécifiée au lieu de la coder en dur.

+0

le superUserID dépendra de la valeur des paramètres affichés. – zsharp

+0

Ensuite, ajoutez quelque chose comme les propriétés que j'ai énumérées dans l'alternative pour spécifier quel paramètre (s) dans les valeurs de route à utiliser pour rechercher l'utilisateur correct. Ce sont les clés de RouteValueDictionary. Concevez la logique dans votre attribut personnalisé pour extraire l'ID de la table appropriée et le comparer à l'utilisateur actuel. – tvanfosson

+0

où est exactement le RouteValueDicitonary? – zsharp

1

Vous pouvez écrire une coutume Autorisez filter (implémenter IAuthorizationFilter)

Votre filtre Authorize personnalisé peut prendre l'ID utilisateur en tant que paramètre.

Quelque chose comme

public class 
    YourAuthorizeFilterAttribute : AuthorizeAttribute, IAuthorizationFilter 
{ 
    public string UserId { get; set; } 

    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if(filterContext.HttpContext.User.Identity.Name != UserId && 
      !filterContext.HttpContext.User.IsInRole(base.Roles)) 
     { 
      filterContext.Result = new RedirectResult("/Account/LogOn"); 
     } 
    } 
} 

Ensuite, utilisez votre propre filtre comme si

[YourAuthorizeFilter(UserId = "theuser", Roles ="Group1")] 

Bonté,

Dan

+0

Vous risquez de laisser l'utilisateur dans le rôle en cas d'échec. Je préférerais une solution sans ce risque. – tvanfosson

+0

Convenu modifié un peu –

Questions connexes