web-dev-qa-db-fra.com

ASP.NET MVC - Comment masquer ou afficher un lien / bouton basé sur l'autorisation de rôle d'utilisateur connecté?

J'utilise ASP.NET MVC4.

C'est mes rôles d'utilisateur

1. Administrator
2. L1 Admin
3. L2 Admin

Les utilisateurs du groupe d'administrateurs ont l'autorisation pour les paramètres (ajout utilisé, paramètres d'autorisation). Afficher les journaux, les rapports d'erreur, etc.

Si un utilisateur est membre du groupe Administrateur, il ne peut voir que les menus liés aux paramètres ci-dessus.

J'ai une table de menu, ayant des détails sur le menu. Il existe certaines fonctions comme Supprimer, Modifier qui sont affichées en fonction du rôle de l'utilisateur actuel et non disponibles dans le menu supérieur. Supprimer, modifier le lien est placé dans un tableau lors de la liste des données. Cela comprenait également et pour ce type d'entrée, IsVisible est faux.

MenuID - MenuName - Controller - Action - ParentID - IsVisible

J'ai une table roleMenu, ayant un menu qui est assigné à chaque rôle.

RoleID - MenuID

Si Admininstrator se connecte, il peut voir tous les menus. Si L1Admin se connecte, il ne peut voir que les menus qui lui sont attribués.

J'ai créé un attribut personnalisé pour l'authentification et après cela, j'interroge la base de données et j'obtiens l'autorisation pour l'utilisateur en fonction du contrôleur et de l'action (le menu de la table rejoint le RoleMenu). Je peux donc restreindre une demande si l'utilisateur essaie d'accéder à une action via URL en tapant dans le navigateur.

Si j'entre en tant que L1Admin, je ne peux voir que les pages de liste et le menu est créé correctement. Dans la page de liste que j'utilise pour la liste. Alors, comment puis-je masquer le lien Modifier/Détails en fonction de l'autorisation de l'utilisateur connecté.

 <div style="float: left">
        <table width="50%">
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Name)
                </th>
                <th>
                </th>
            </tr>
            @foreach (var item in Model)
            {
                <tr>
                    <td style="width:30%;">
                        @Html.DisplayFor(modelItem => item.Name)
                    </td>
                    <td style="width:20%;">
// I need to hide EDIT/DELETE based on the permission setting of Current logged in user.
                        @Html.ActionLink("Edit", "Edit", new { id = item.ID }) | 
                        <a href="Server/@item.ID">Details</a> |
                        @Html.ActionLink("Delete", "Delete", new { id = item.ID })
                    </td>
                </tr>
            }
        </table>
    </div>

Merci d'avance.

MODIFIER

Je stocke les détails de l'autorisation dans une base de données.

22
kbvishnu

Par exemple, vous pouvez le faire de la manière suivante:

@if (ViewContext.HttpContext.User.IsInRole("Your role"))
{
    // Do something here
}
42
laszlokiss88

Option 1 - Considérant que vous utilisez l'adhésion asp .net.

@if (Roles.IsUserInRole("Administrator"))
{ 
  //show link 
}
else
{
  //hide link/button
}

Option 2 - Spécifiez les rôles dans userData au cas où vous créez AuthCookie par vous-même et définissez plus tard HttpContext.Current.User sur nouveau GenericPrinciple (récupérez le rôle utilisateur à partir des données utilisateur de authcookie) sur Application_PostAuthenticateRequest, méthode du fichier Global.asax.cs - laissant l'implémentation à vous sur Google.

Cela devrait fonctionner plus tard

System.Web.HttpContext.Current.User.IsInRole("RoleName");
11
RollerCosta

En raison du stockage des détails d'autorisation dans une base de données, vous pouvez vérifier l'autorisation comme suit:

Option 1 Créez une extension de lien d'action autorisée . Démo

Créez un ActionLink autorisé HTML personnalisé et appelez comme ci-dessous

 <ul id="menu">              
    <li><%: Html.ActionLink("Home", "Index", "Home")%></li>
    <li><%: Html.ActionLink("About", "About", "Home")%></li>

    // Next line What you are looking for
    <li><%: Html.ActionLinkAuthorized("The Privilege Zone", "ThePrivilegeZone", "Home", true)%></li>
</ul>

Remarque: pour une meilleure sécurité, vous avez besoin d'un filtre d'action personnalisé pour vérifier que toute la demande est autorisée.

Option 2 Créez une fonction statique et vérifiez le lien avant l'action

public static bool IsUserInRole(string rolenamefrom session)
{
    // Check the user have the privilege then return true/false
}

@if (IsUserInRole("Administrator"))
{ //show link }
else
{//hide link/button}
5
Nikhil K S

Créez une extension d'assistance personnalisée comme celle-ci, où CustomMethodForRetrievingUserFlag () renvoie les autorisations utilisateur, CustomMethodForRetrievingFlags renvoie les autorisations autorisées pour une action par exemple. Bonne chance.

Utilisation depuis la vue: @ Url.CustomUrl ("Accueil", "Index")

[Flags]
public enum AuthorizeFlags
{
    Administrator = 1,
    L1 = 2,
    L2 = 4
}

public static class UrlHelperExtensions
{
    public static MvcHtmlString CustomUrl(this UrlHelper urlHelper, string controllerName, string actionName, object routeValues = null)
    {
        var actionFlag = CustomMethodForRetrievingFlags(actionName);
        var userFlag = CustomMethodForRetrievingUserFlag();

        if ((actionFlag & userFlag) == userFlag)
        {
            return new MvcHtmlString(urlHelper.Action(actionName, controllerName, routeValues));
        }

        return new MvcHtmlString(String.Empty);
    }

    private static AuthorizeFlags CustomMethodForRetrievingUserFlag()
    {
        return AuthorizeFlags.L2;
    }

    private static AuthorizeFlags CustomMethodForRetrievingFlags(string actionName)
    {
        return (AuthorizeFlags.Administrator | AuthorizeFlags.L1); // test stub
    }
}
4
Alex Yaroshevich