Identity 2.0 Custom UserManager/RoleManager и бритва, вызывающая User.IsInRole("RoleName")

Вопросы ниже: прочитайте, чтобы увидеть, что вам нужно, чтобы помочь ответить...

я имею

  • VS 2013
  • MVC 5 с видами бритвы
  • Dapper DAL Custom UserManager и UserStore/User: IUser

Я создаю свой собственный UserManager, RoleManager, UserStore, RoleStore и все на основе CustomUser: IUser и CustomRole: IRole

Я могу изменить пароли, восстановить забытые пароли, войти, выйти из системы... все работает хорошо.

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

User.IsInRole("Administrators");

Я получаю исключение SQL (что, вероятно, происходит в классе iPrincipal Identity???) из другого модуля:

System.Data.SqlClient.SqlException occurred
  _HResult=-2146232060
  _message=A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)
  Source=.Net SqlClient Data Provider
  ErrorCode=-2146232060
  _doNotReconnect=false
  Class=20
  LineNumber=0
  Number=-1
  Server=""
  State=0
  StackTrace:
       at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
  InnerException: <null>

Но я могу позвонить

var user = AsyncHelpers.RunSync<CloudUser>(() => UserManager.FindByNameAsync(User.Identity.Name));
ViewBag.IsInAdminRole = AsyncHelpers.RunSync<bool>(() => UserManager.IsInRoleAsync(user.Id, "Administrators"));

В моем контроллере серверный код....

Вопросы:

  1. Какова связь между User.IsInRole и UserManager/UserStore и / или RoleManager

  2. Как получить User.IsInRole("Администраторы") в Razor View, чтобы "понять", что ему нужно использовать мою собственную реализацию аутентификации Identity?

1 ответ

Решение

Я подозреваю, что ваша реализация не обеспечивает ClaimsPrincipal когда пользователь вошел в систему.

@User должно быть ClaimsPrincipal а также IsInRole ( см. источник) не попадает в базу данных, а проверяет наличие утверждений типа "Роль", установленных для личности принципала. Если вы видите это исключение, ваш IPrincipal отличается от формы "ClaimsPrincipal".

Я прочитал ответ, который вы связали, и я не думаю, что это лучшее решение для использования с Identity Framework. Ответ предварительно удостоверение личности и говорит о MembershipProvider. Вы должны были делать подобные вещи, когда имели дело с MembershipProvider. Теперь Identity дает вам гораздо лучший и более чистый способ выполнения пользовательских функций.

Я бы посоветовал против реализации CustomPrincipal и использовать ClaimsPrincipal обеспечивается.Net Framework. Просто добавьте претензии типа ClaimTypes.Role с именами ролей на вашем участнике, когда вы возвращаете IPrincipal из вашего UserManager.CreateIdentityAsync,

Другие вопросы по тегам