web-dev-qa-db-fra.com

rasoir asp.net MVC3: afficher le lien d'action en fonction du rôle de l'utilisateur

Je suis nouveau sur MVC. Je veux pouvoir masquer certains liens d'action pour certains utilisateurs. Disons que j'ai un lien d'action "créer" que je veux seulement que les administrateurs voient et cliquent. Je veux utiliser une sorte de "modèle connecté" disponible sur asp.net, mais cela ne semble pas fonctionner avec le rasoir.

Je pourrais utiliser une sorte de bloc de code avec une instruction if vérifiant l'utilisateur actuel et son rôle, mais ce n'est peut-être pas la meilleure pratique?

mon index.cshtml ..

// want some adminauth attribute here...
@Html.ActionLink("Create New", "Create")

mon contrôleur ..

// GET: /Speaker/Create
[Authorize(Roles = "Administrators")]
public ActionResult Create()
{
    return View();
}
62
Mathias Nohall

Dans le passé, j'ai créé une fonction d'aide pour renvoyer uniquement la sortie lorsqu'un critère est rempli comme ceci:

public static MvcHtmlString If(this MvcHtmlString value, bool evaluation)
{
     return evaluation ? value : MvcHtmlString.Empty;
}

vous pouvez donc utiliser ceci:

@Html.ActionLink("Create New", "Create").If(User.IsInRole("Administrators"))

De cette façon, il est lisible et court

136
Richard

Si vous voulez un bloc de code, cela ferait dans la vue:

@if (Roles.IsUserInRole("Administrators"))
{
  <li>@Html.ActionLink("Create New", "Create")</li>
}
41
Matthieu

J'ai modifié le code de Richard pour fournir un paramètre MvcHtmlString facultatif à renvoyer si l'évaluation est fausse.

public static MvcHtmlString If(this MvcHtmlString value, bool evaluation, MvcHtmlString falseValue = default(MvcHtmlString))
        {
            return evaluation ? value : falseValue;
        }
7
Elan Hasson

Si vous n'avez pas activé roleManager et que vous souhaitez toujours vérifier le rôle de l'utilisateur, vous pouvez le faire comme ceci:

 @if (@User.IsInRole("administrator"))
 {
   @Html.ActionLink("Create New Version", "Create")
 }

Ce que nous faisons ici, c'est que nous accédons simplement aux propriétés de l'utilisateur. Cela peut être utile si vous gérez vous-même les rôles.

2
Sudarshan_SMD

Vous pouvez ajouter une fonction à App_Code/ViewFunctions.cshtml (créer si manquant)

@using System.Web.Mvc;
@functions{
public static object ConditionalActionLink(object actionLink, ICollection<string> arrAuthUsers)
{
    bool objIsVisible = arrAuthUsers
        .Select(s => User.IsInRole(s))
        .Where(s => s.Equals(true))
        .Any();

    return (objIsVisible)
        ? actionLink
        : MvcHtmlString.Empty;
}

Pour utiliser cette fonction, ajoutez simplement le code suivant à la vue.

@ViewFunctions.ConditionalActionLink(
@Html.ActionLink("TextToDisplay", "SomeAction", new { Area = "SomeArea", Controller = "SomeController" }), 
new string[] { "administrator","jDoe", "someOtherUser" })

La solution suggérée par Richard est vraiment belle, bien que, comme Matthieu l'a noté, quelqu'un puisse également avoir besoin de code HTML supplémentaire pour être rendu (ou non rendu). Ainsi, la solution de Matthieu semble être plus largement applicable, je voudrais simplement centraliser la logique concernant les utilisateurs qui sont considérés comme des administrateurs dans la méthode d'extension.

Méthode d'extension:

public static bool IsAdmin(this WebViewPage page)
{
    return page.User.IsInRole(@"Domain\ProjectAdmins");
}

Usage:

@if (this.IsAdmin())
{
    <p>
        @Html.ActionLink("Create New Version", "Create")
    </p>
}
0
Oleksandr Lytvyn