Пользователь в моем веб-приложении может иметь несколько ролей из разных приложений.Эти роли хранятся в HttpContext
в массиве с сериализованным названием Roles.
В настоящее время для моего контроллера я реализую специальный фильтр, который десериализуетмассив и читает элементы внутри, как это
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
})]
Однако, это работает только до контроллера.Как я могу расширить это для работы в представлении, чтобы иметь возможность сегментировать области на панели навигации, например, на основе роли пользователей?Это возможно?