Проверка авторизованной роли пользователя в представлении в ASP.NET Core 2.2 - PullRequest
0 голосов
/ 13 февраля 2019

Пользователь в моем веб-приложении может иметь несколько ролей из разных приложений.Эти роли хранятся в HttpContext в массиве с сериализованным названием Roles.

enter image description here

В настоящее время для моего контроллера я реализую специальный фильтр, который десериализуетмассив и читает элементы внутри, как это

public void OnActionExecuting(ActionExecutingContext context)
{
            string[] applications = ListOfApplications.Split(",");
            string[] roles = ListOfRoles.Split(",");
            var userRoles = context.HttpContext.User.Claims.Where(c => c.Type == "Roles").Select(c => c.Value).ToList();
            var matches = 0;
            foreach (var item in userRoles)
            {
                var currentItem = JsonConvert.DeserializeObject<UserRoleDetailsViewModel>(item);
                UserRoleDetailsViewModel urdvm = new UserRoleDetailsViewModel
                {
                    Id = currentItem.Id,
                    Name = currentItem.Name,
                    ApplicationId = currentItem.ApplicationId,
                    ApplicationName = currentItem.ApplicationName
                };
                for (var i = 0; i < applications.Length; i++)
                {
                    if(applications[i] == ApplicationGlobals.All && roles[i] == RoleGlobals.All)
                    {
                        matches++;
                    }
                    if(applications[i]== ApplicationGlobals.All && roles[i] == urdvm.Name)
                    {
                        matches++;
                    }
                    if(applications[i] == urdvm.ApplicationName && roles[i] == urdvm.Name)
                    {
                        matches++;
                    }
                }
            }
            if (matches == 0)
            {
                context.Result = new RedirectToActionResult("Index", "Home", null);
            }
}

И я называю его поверх моего контроллера следующим образом:

[Authorize]
[TypeFilter(typeof(ValidateRolesFilter), Arguments = new object[] {
        ApplicationGlobals.app1+","+ApplicationGlobals.app1
        ,RoleGlobals.SystemAdministrator+","+RoleGlobals.User
})]

Однако, это работает только до контроллера.Как я могу расширить это для работы в представлении, чтобы иметь возможность сегментировать области на панели навигации, например, на основе роли пользователей?Это возможно?

1 Ответ

0 голосов
/ 13 февраля 2019

Однако это работает только до контроллера.Как я могу расширить это для работы в представлении, чтобы иметь возможность сегментировать области на панели навигации, например, на основе роли пользователей?Возможно ли это?

Да!возможный.Ниже описан способ сделать это в удостоверении ASP.NET Core.

@using Microsoft.AspNetCore.Identity
@inject SignInManager<ApplicationUser> SignInManager // ApplicatonUser is the class that inherited IndentityUser
@inject UserManager<ApplicationUser> UserManager

<ul class="navbar-nav">
    @if (SignInManager.IsSignedIn(User))
    {
       // Here is navbar items for authenticated (logged in) user

       If(User.IsInRole("Admin");)
       {
           // Here is navbar items for only user with `Admin` Role
       }
    }
    else
    {
        // Here is navbar items for user if not logged in
    }
</ul>
...