Функция Role Manager не была включена


192

Получил следующее ProviderException :

Функция Role Manager не была включена.

Все идет нормально.

Есть ли где-нибудь метод, который можно вызвать, чтобы проверить, был ли включен Role Manager или нет?

Ответы:


302

Вы можете сделать это, прочитав логическое свойство по адресу:

System.Web.Security.Roles.Enabled

Это прямое чтение из enabledатрибута roleManagerэлемента в web.config:

<configuration>
  <system.web>
    <roleManager enabled="true" />
  </system.web>
</configuration>


Обновление:
для получения дополнительной информации, проверьте этот образец MSDN: https://msdn.microsoft.com/en-us/library/aa354509(v=vs.110).aspx


1
как я могу сделать это из кода вместо web.config? Я попытался вставить это, Application_Startи это говоритThis method can only be called during the application's pre-start initialization phase.
— Маслоу

1
Куда это идет в web.config?
— Мэтт Коннолли

17
После добавления выше в web.config roleManager включен. Но сейчас я получаю исключениеUnable to connect to SQL Server database
— Ирфан Юсаниф

2
@Infotekka «Невозможно подключиться к базе данных SQL Server».
— Джек,

2
вау, это отличный ответ, мне даже не нужно ничего настраивать, просто работает как шарм. После настройки в web.config я могу просто проверить User.Identity.IsAuthenticated, чтобы увидеть, аутентифицирован ли пользователь при входе в систему. Так круто asp.net
— Quan

52

Если вы попали сюда, потому что используете новое ASP.NET Identity UserManager, то, что вы на самом деле ищете, это RoleManager:

var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));

roleManager даст вам доступ, чтобы увидеть, существует ли роль, создать и т. д., плюс она создана для UserManager


73
При чем тут 3-летний ребенок? Я попал на этот пост из Google, потому что имел дело с проблемой настройки Identity. Так как я понял это ... следующий человек, имеющий дело с той же проблемой, что и я, которого привел сюда Google, будет знать, что делать ...
— Серж Саган,

1
Кроме того, Identity UserManager имеет полезную функцию для получения ролей для данного пользователя: UserManager.GetRolesAsync (User.Identity.GetUserId ());
— keithl8041

Где вы помещаете var roleManager = new RoleManager <IdentityRole> (new RoleStore <IdentityRole> (new ApplicationDbContext ())); ?
— Mario M

Вы можете сделать это где угодно в приложении. Очевидно, вам нужно разрешить некоторые ссылки, но везде, где вам нужны роли в приложении Identity, вы можете использовать это утверждение.
— Серж Саган

11

В другом месте через Google я нашел 2 предложения, в которых предлагалось: а) убедиться, что ваша строка соединения с БД (та, которую использует Роли) правильная, и что ключ к ней написан правильно, и б) что флаг Enabled на RoleManager установлен в true. Надеюсь, что один из тех помогает. Это для меня.

Вы пытались проверить Roles.Enabled? Кроме того, вы можете проверить Roles.Provider, чтобы увидеть, сколько поставщиков доступно, и вы можете проверить Roles.Provider для поставщика по умолчанию. Если это ноль, то нет ни одного.


Спасибо за ответ. Но это не то, что я хочу. Я хочу метод, который проверяет, включена ли функция Role Manager или нет, без кеширования ProviderException для этой цели.
— gsharp 12.10.10

8

Я нашел этот вопрос из-за исключения, упомянутого в нем. В моем Web.Config не было <roleManager>тега. Я понял, что даже если я добавлю его (как предложил Infotekka ), он окажется в исключении базы данных. После следования предложениям в других ответах здесь ни один полностью не решил проблему.

Так как эти теги Web.Config могут быть сгенерированы автоматически, было бы неправильно решить их, добавив их вручную. Если вы находитесь в аналогичном случае, отмените все изменения, внесенные в Web.Config и в Visual Studio:

  1. Нажмите Ctrl+ Q, введите nuget и нажмите «Управление пакетами NuGet»;
  2. Нажмите Ctrl+ E, введите провайдеров и в списке должны появиться « Основные библиотеки универсальных провайдеров Microsoft ASP.NET » и «Универсальные провайдеры Microsoft ASP.NET для LocalDB » (оба созданы Microsoft);
  3. Нажмите на кнопку Установить в обоих из них и закройте окно NuGet;
  4. Проверьте свой Web.config, и теперь у вас должен быть хотя бы один <providers>тег внутри тегов Profile , Membership , SessionState, а также внутри нового тега RoleManager , например:

    <roleManager defaultProvider="DefaultRoleProvider">
        <providers>
           <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=NUMBER" connectionStringName="DefaultConnection" applicationName="/" />
        </providers>
    </roleManager>
  5. Добавить enabled="true"вот так:

    <roleManager defaultProvider="DefaultRoleProvider" enabled="true">
  6. Нажмите F6Build, и теперь все должно быть в порядке, чтобы перейти к обновлению базы данных без этого исключения:

    1. Нажмите Ctrl+ Q, введите менеджер , нажмите «Консоль диспетчера пакетов»;
    2. Тип update-database -verboseи метод Seed будут работать очень хорошо (если вы ни разу не перепутали) и создадут несколько таблиц в вашей базе данных;
    3. Нажмите Ctrl+ W+ , Lчтобы открыть Проводник сервера , и вы должны быть в состоянии проверить в Connections Data> DefaultConnection> Таблицы в Роли и UsersInRoles таблицы среди вновь созданных таблиц!

1
« Поскольку поля Web.Config генерируются автоматически », это не совсем правильно. Хотя многие пакеты NuGet автоматически настраивают файлы конфигурации, не существует установленного правила, требующего от них этого.
— Кевин Р.

Это потрясающе. Thnx
— sapatelbaps

6

Если вы используете, ASP.NET Identity UserManagerвы можете получить это так:

var userManager = Request.GetOwinContext().GetUserManager<ApplicationUserManager>();

var roles = userManager.GetRoles(User.Identity.GetUserId());

Если вы изменили ключ для пользователя с Guid на Int, например, используйте этот код:

var roles = userManager.GetRoles(User.Identity.GetUserId<int>());

Это сработало для меня. Пожалуйста, скажите почему, если вы голосуете против.
— Огглас

это не работает, потому что вам нужно преобразовать ID пользователя в int таким образом: userManager.GetRoles (Convert.ToInt32 (User.Identity.GetUserId <int> ()));
— игрушка

@toy Нет, <int> получит значение как int. Нет необходимости конвертировать. Конечно, чтобы это работало, ключ идентификации должен быть int.
— Огглас

-1
<roleManager
  enabled="true"
  cacheRolesInCookie="false"
  cookieName=".ASPXROLES"
  cookieTimeout="30"
  cookiePath="/"
  cookieRequireSSL="false"
  cookieSlidingExpiration="true"
  cookieProtection="All"
  defaultProvider="AspNetSqlRoleProvider"
  createPersistentCookie="false"
  maxCachedResults="25">
  <providers>
    <clear />
    <add
       connectionStringName="MembershipConnection"
       applicationName="Mvc3"
       name="AspNetSqlRoleProvider"
       type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    <add
       applicationName="Mvc3"
       name="AspNetWindowsTokenRoleProvider"
       type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </providers>
</roleManager>

-1

Вот код, который вам нужно вставить в свой Account Controller в MVC5 и более поздних версиях, чтобы получить список ролей пользователя:

csharp public async Task<ActionResult> RoleAdd(string UserID) { return View(await UserManager.GetRolesAsync(UserID)).OrderBy(s => s).ToList()); }

Нет необходимости использовать Roles.GetRolesForUser()и включать функцию Role Manager.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.