2014-11-05 2 views
0

Использование Идентичность 2.0, я модифицировал использовать целое число в качестве первичного ключа следующие http://www.asp.net/identity/overview/extensibility/change-primary-key-for-users-in-aspnet-identityIdentity 2.0 с целыми ключами: почему User.IsInRole всегда возвращает false?

Он прекрасно работает, за исключением, когда от контроллера, звоню:

User.IsUserInRole("admin"); 

Он всегда возвращает ложь. Я проверил базовую таблицу и данные в порядке.

Однако, если я:

var t = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
bool ok = t.IsInRole(User.Identity.GetUserId<int>(), "admin"); 

то он работает отлично. Похоже, что проблема только в Controller.User

Кроме того, атрибуты не работают, например [Authorize(Roles = "admin")]

Кто-то была такая же проблема?

UPDATE:

Это ничего связано с контроллером, Thread.CurrentPrincipal не имеет ту же проблему:

Thread.CurrentPrincipal.IsInRole("admin"); 

UPDATE 2:

кажется, что проблема заключается в таблице AspNetUserRoles. Identity добавила новый столбец, внешний ключ к моей расширенной пользовательской таблице. Мне кажется излишним, потому что есть столбец UserId. Проблема в том, что все значения этого столбца NULL. Я думаю, что если я смогу понять, как перенаправить на UserId, все будет работать нормально.

+0

[Авторизовать (Roles = "admin")] и User.IsInRole проверить файл cookie, который был создан во время входа в систему. Должно быть что-то не так, как вы установили cookie cookie, который не включал информацию о роли пользователя. – DSR

+0

DSR, однако следующий код работает нормально: var t = HttpContext.GetOwinContext(). GetUserManager (); bool ok = t.IsInRole (User.Identity.GetUserId (), "admin"); –

+0

Да, это правильно, потому что вы напрямую обращаетесь к базе данных с помощью этого кода. [Authorize (Roles = "admin")] и User.IsInRole не получают доступ к базе данных, а не получают информацию из файла cookie проверки подлинности. Отправьте свой стартовый код owin, где вы настроите файлы cookie для проверки подлинности. Следуйте этим видеоурокам http://stackoverflow.com/questions/25857806/extending-identityuserrole-in-identity-2-0/25857923#25857923 – DSR

ответ

0

Попробуйте добавить Role претензии, когда пользователь подписывает в

0

Я решил это: Проблема заключалась в том, я создал класс, производный от IdentityUser, дополнительно я включил таблицу для каждого типа (ТРТ) по ошибке, добавив имя таблицы. Identity 2.0 добавила третий столбец в AspNetUserRoles, указывающий на этот новый тип, и поскольку он был нулевым, роли не были. Теперь я использую Table Per Hierarchy (TPH), и все работает нормально.

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