У меня есть организация. В этой организации вы можете иметь несколько ролей. (Давайте возьмем только два из них на данный момент), Медсестра и Администратор.Ограничение Некоторые части зрения
Так что я 'защищенные' мои действия контроллера как этот
[AuthorizeUser(UserRole = "Admin, Nurse", OrganizationType = "Institution")]
Мой класс AuthorizeUser, как это
public class AuthorizeUser : AuthorizeAttribute
{
public String UserRole { get; set; }
public string OrganizationType { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var isAuthorized = base.AuthorizeCore(httpContext);
if (!isAuthorized)
{
return false;
}
return CheckOrganizationType.checkRole(this.UserRole, this.OrganizationType, Auth.CurrentUser);
}
}
Функция CheckOrganiztionType, как это
public static bool checkRole(String role, String organizationType, User user)
{
RolesType rt = null;
OrganizationType ot = null;
foreach (UserRoles ur in user.GetUserRoles())
{
rt = RolesType.Get(ur.organizationTypeId,ur.roleTypeId);
ot = OrganizationType.Get(ur.organizationTypeId, "1");
}
if (rt != null && role.Contains(rt.Name) && ot != null && ot.Name == organizationType)
{
return true;
}
else
{
return false;
}
}
Он работает в совершенстве. Если я не админ или не медсестра, мне не разрешено ехать сюда.
Но то, что я хотел бы сделать, также состоит в том, чтобы контролировать некоторые части моего представления, используя ту же технику. После поиска в Интернете я нашел то, что я собираюсь разместить ниже, и я бы хотел, чтобы вы прокомментировали это.
В моем файле cshtml я это делаю
@using InstaFood.Helpers
@using InstaFood.Secuirty
@if (CheckOrganizationType.checkRole("Admin", "Institution", Auth.CurrentUser))
{
<span>Admin</span>
}else{
<span>Nurse</span>
}
Как вы думаете, что это правильный подход, и есть ли другой способ сделать это?
Кажется как разумный подход. Если условные проверки работают на некотором серверном коде, они будут работать в другом серверном коде. Пока проверки безопасности выполняются на стороне сервера, а не на стороне клиента, вы, вероятно, в порядке. Независимо от того, скажут ли это масштабы с точки зрения ремонтопригодности, что-то скажет время. В какой-то более поздний момент вы можете найти, что лучше просто создать отдельные представления и условно вернуть правильное представление из контроллера. Есть плюсы и минусы в любом случае, поэтому это зависит от того, что проще поддерживать в вашей конкретной кодовой базе. – David
Это неплохое решение: http://stackoverflow.com/q/13470761/1207195 –
@ Давид благодарит за объяснение. – mohsinali1317