Функция 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.