2012-05-31 4 views
0

У меня есть этот код, но я не знаю, почему это работает неправильно. У меня создан созданный поставщик роли.IsUserInRole не работает в CSHTML

@if (Roles.IsUserInRole(User.Identity.Name, "Manager")) 
{ 
    <li>@Html.ActionLink("User Management", "Index", "User")</li> 
} 

Это нестандартный код, остальное не было изменено.

public override bool IsUserInRole(string username, string roleName) 
    {  
     UserRoleType usrt = (from usr in db.Users 
        join usrRole in db.UserRoles on usr.UserID equals usrRole.UserID 
        where usr.Email == username 
        select usrRole.UserRoleType).FirstOrDefault(); 

     if (roleName.Split(',').Contains(usrt.UserRoleTypeName)) 
      return true; 

     return false; 
    } 

Это делает работу, когда я делаю это:

UserRoleProvider roleProvider = System.Web.Security.Roles.Provider as UserRoleProvider; 

if (roleProvider.IsUserInRole(httpContext.User.Identity.Name, Roles) || String.IsNullOrEmpty(Roles)) 
      return true; 

EDIT:

public override string[] GetRolesForUser(string roleName) 
    { 
     return db.UserRoleTypes.Select(u => u.UserRoleTypeName).ToArray(); 

    } 
+0

'где usr.Email == имя пользователя' является правильным? – kenwarner

+0

Да, этот код действительно работает. Я просто не понимаю, почему это не работает, когда я делаю @if (Roles.IsUserInRole (User.Identity.Name, «Менеджер»)) – xivo

+0

Добавил ли пользовательский поставщик роли в свой web.config? – kenwarner

ответ

0

Оказывается GetRolesForUser была написана правильно и тянул все пользователи, так что с проверкой подлинности на основе ВСЕ пользователи, что означает, что это было в первую очередь.

Перечитайте документацию, чтобы получить мой ответ здесь.

http://msdn.microsoft.com/en-us/library/system.web.security.roleprovider.getrolesforuser.aspx

0

Оказывается, что

User.IsInRole(rolename)
использует
MembershipProvider.GetRolesForUser(username)
Это мне потребовалось некоторое время, чтобы понять это.

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