2015-05-21 2 views
7

Я использую идентификатор 2 для аутентификации на веб-сайте mvc 5. На мой взгляд, я хочу проверить роль пользователя:User.IsInRole return false

@if(User.IsInRole("Customers")) 
{ 
    @*do something*@ 
} 

, но это всегда возвращает ложь, я уже установили <roleManager enabled="true" /> в веб-конфигурации. всякая помощь пожалуйста.

+0

Означает ли ваша база данных, что пользователь определенно входит в эту роль и является ли имя роли точно правильным? И пользователь определенно зарегистрировался? IE ... если вы добавите '[Authorize]' в контроллер, выполняете ли действия нагрузки? – Luke

+0

Имя роли правильное и его существует в db для этого пользователя. –

+0

Если вы добавили '[Authorize (Roles =" Customers ")]' к вашему действию, загружается ли действие? Как вы добавили пользователя в эту роль? – Luke

ответ

6

Я просто получил его для работы с моей установкой, которая также использует Identity Framework.

Я добавил пользователя к роли, используя следующий код:

this.RoleManager.CreateAsync(new Role() {Name = "Customers"}); 

this.UserManager.AddToRoleAsync(this.User.Identity.GetUserId<int>(), "Amazing"); 

Тогда в любое время после этого, когда я побежал User.IsInRole("Customers"); вернулся ложным, что пока я не relogged их обратно в

.

Вам необходимо повторно войти в систему после добавления пользователя в роль. Информация о роли хранится в файлах cookie.

Я побежал следующий войти пользователь снова:

var user = await this.UserManager.FindByNameAsync("bob"); 
var identity = await this.UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); 

this.AuthManager.SignIn(new AuthenticationProperties() { IsPersistent = true }, identity); 

С этого момента, User.IsInRole("Customers") работал для меня и вернулся true.

Это не сработает, хотя вы не можете проверить в своем приложении, что он знает о роли, к которой вы хотите добавить. Вы можете проверить существование роли «клиентов», используя свой RoleManager следующим образом:

var roleExists = (this.RoleManager.FindByNameAsync("Customers").Result != null); 
1

У меня такая же проблема, так как я настроить IdentityDbContext класс. И причина, по которой User.IsInRole("Customers") всегда ложна в моем случае, заключается в том, что у меня включена потерянная загрузка EF в моем настраиваемом классе контекста. Я попытался включить ленивую загрузку, чем я вышел, а затем, и User.IsInRole возвращает ожидаемое значение.

public partial class Context : IdentityDbContext<User> 
    { 
     public Context() : base("name=Context") 
     { 
      this.Configuration.LazyLoadingEnabled = true;   
     } 
+0

Сначала я думал, что это было решением, но в моем случае неисправность не является детерминированной. Согласно моему отладку, 'LazyLoadingEnabled = true;' является значением по умолчанию (MVC 5) –