2014-12-09 2 views
-1

У меня есть организация. В этой организации вы можете иметь несколько ролей. (Давайте возьмем только два из них на данный момент), Медсестра и Администратор.Ограничение Некоторые части зрения

Так что я 'защищенные' мои действия контроллера как этот

[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> 
} 

Как вы думаете, что это правильный подход, и есть ли другой способ сделать это?

+1

Кажется как разумный подход. Если условные проверки работают на некотором серверном коде, они будут работать в другом серверном коде. Пока проверки безопасности выполняются на стороне сервера, а не на стороне клиента, вы, вероятно, в порядке. Независимо от того, скажут ли это масштабы с точки зрения ремонтопригодности, что-то скажет время. В какой-то более поздний момент вы можете найти, что лучше просто создать отдельные представления и условно вернуть правильное представление из контроллера. Есть плюсы и минусы в любом случае, поэтому это зависит от того, что проще поддерживать в вашей конкретной кодовой базе. – David

+0

Это неплохое решение: http://stackoverflow.com/q/13470761/1207195 –

+0

@ Давид благодарит за объяснение. – mohsinali1317

ответ

1

Если вы реализуете пользовательский RoleProvider, где и обеспечить роли для пользователя на основе модели домена, то в ваших взглядах вы можете использовать такой код:

if (User.IsInRole("Admin")) { 
    <span>Admin</span> 
} 
else { 
    .... 
} 

пользовательских RoleProvider можно найти здесь http://msdn.microsoft.com/en-us/library/317sza4k(v=vs.100).aspx

зарегистрировать вас на заказ RoleProvider необходимо настроить web.config при конфигурировании/system.web/roleManager

<roleManager defaultProvider="OdbcRoleProvider" 
    enabled="true" 
    cacheRolesInCookie="true" 
    cookieName=".ASPROLES" 
    cookieTimeout="30" 
    cookiePath="/" 
    cookieRequireSSL="false" 
    cookieSlidingExpiration="true" 
    cookieProtection="All" > 
    <providers> 
    <clear /> 
    <add 
     name="OdbcRoleProvider" 
     type="Samples.AspNet.Roles.OdbcRoleProvider" 
     connectionStringName="OdbcServices" 
     applicationName="SampleApplication" 
     writeExceptionsToEventLog="false" /> 
    </providers> 
</roleManager> 
+0

Любой пример того, как выполнять роль поставщика роли? – mohsinali1317

+0

добавлено больше информации –

Смежные вопросы