0

J'ai créé un ENUM avec des niveaux d'accès de sécurité, un exemple:Créer différents niveaux d'accès en utilisant l'authentification

public enum AccessLevel 
{ 
    Total, 
    DeletionPrivileges, 
    MaintainUsers, 
    MaintainInventory, 
    QueriesOnly, 
    None 
} 

Je peux gérer le site afin que certaines caractéristiques, par exemple supprimer, ne sont pas présentés à quelqu'un sans privilèges de suppression. Mais je veux aussi utiliser une sorte d'autorisation dans le code.

Dans le cadre par défaut, il est possible d'empêcher l'accès à certaines zones d'un projet en utilisant [Authorize], comment puis-je créer des niveaux d'autorité différents pour marquer chaque méthode?

+0

Utilisez-vous l'identité pour l'authentification? –

+0

@SamFarajpourGhamari oui je suis –

Répondre

2

Vous pouvez utiliser la fonction d'authentification basée sur la revendication d'Identité pour viser facilement ce but. D'abord, vous devez ajouter réclamation appropriée par utilisateur dans le journal de la méthode d'action pour faire changer votre journal dans la méthode d'action comme ceci:

[HttpPost] 
public ActionResult Login(LoginViewModel model, string returnUrl) 
{ 
    if (ModelState.IsValid) 
    { 
     var userManager=HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
     var user = userManager.Find(model.UserName, model.Password); 
     if (user != null) 
     { 
      var ident = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie); 

      // imaging you have a custom class which return user access levels 
      var userAccessLevels=_accessLevelManager.GetAccessLevels(user.Id); 
      // now we are going to add our custom claims 
      ident.AddClaims(new[] 
      { 
       // add each access level as a separate claim 
       new Claim("AccessLevel",userAccessLevels[0].ToString()), 
       new Claim("AccessLevel",userAccessLevels[1].ToString()), 
       // and so on 
      }); 
      HttpContext.GetOwinContext().Authentication.SignIn(new AuthenticationProperties { IsPersistent = false }, ident); 
      // authentication succeed do what you want 
      return Redirect(login.ReturnUrl ?? Url.Action("Index", "Home")); 
     } 
    } 
    ModelState.AddModelError("", "Invalid username or password"); 
    return View(login); 
} 

Maintenant, nous avons injecté avec succès nos demandes à l'identité. Mais vous avez besoin d'un attribut personnalisé pour autoriser vérifier ses allégations comme ceci:

public class ClaimsAccessAttribute : AuthorizeAttribute 
{ 
    public string ClaimType { get; set; } 
    public string Value { get; set; } 

    protected override bool AuthorizeCore(HttpContextBase context) 
    { 
     return context.User.Identity.IsAuthenticated 
      && context.User.Identity is ClaimsIdentity 
      && ((ClaimsIdentity)context.User.Identity).HasClaim(x => 
       x.Type == ClaimType && x.Value == Value); 
    } 
} 

Maintenant, vous pouvez facilement utiliser votre attribut dans vos méthodes d'action:

[ClaimsAccess(CliamType="AccessLevel",Value="DeletionPrivileges")] 
public ActionResult MyAction() 
{ 
    // also you have access the authenticated user's claims 
    // simply by casting User.Identity to ClaimsIdentity 
    // ((ClaimsIdentity)User.Identity).Claims 
} 
+0

Merci de mettre cet effort dans cette réponse. Très appréciée. –