Функція менеджера ролей не ввімкнена


192

Отримав наступного постачальника :

Функція менеджера ролей не ввімкнена.

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

Чи є десь метод, який можна викликати, щоб перевірити, увімкнено Менеджер ролей чи ні?

Відповіді:


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.IsAuthentication, щоб побачити, чи зареєстровано користувача для входу. Так круто asp.net
— Quan

52

Якщо ви потрапили сюди, тому що використовуєте нове ASP.NET Identity UserManager, ви насправді шукаєте RoleManager:

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

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


73
Що стосується 3-річного віку? Мене взяли на цю посаду від Google, оскільки я мав справу з проблемою встановлення ідентичності. Оскільки я зрозумів це… наступна людина, яка займається тим же питанням, що і мене, що приїхала сюди від Google, дізнається, що робити ...
— Serj Sagan

1
Також Identity UserManager має корисну функцію для отримання ролей для даного користувача: UserManager.GetRolesAsync (User.Identity.GetUserId ());
— keithl8041

Куди ви помістите var roleManager = новий RoleManager <IdentityRole> (новий RoleStore <IdentityRole> (новий ApplicationDbContext ())); ?
— Маріо М

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

11

У Google я знайшов 2 пропозиції, які запропонували а) переконатися, що ваш db-з'єднання (той, який використовуються Ролями) правильний, і що ключ до нього написано правильно, і b) що прапор Enabled у RoleManager встановлено на істинне. Сподіваюся, один із них допомагає. Це зробило для мене.

Ви спробували перевірити Roles.Enabled? Також ви можете перевірити Roles.Providers, щоб побачити, скільки постачальників доступно, і ви можете перевірити Roles.Provider для постачальника послуг за замовчуванням. Якщо він недійсний, то його немає.


Дякую за відповідь Але це не те, що я хочу. Я хочу метод, який перевіряє, чи включена функція Менеджера ролей, чи не кешувати ProviderException для цієї мети.
— gsharp

8

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

Оскільки ці теги Web.Config можна генерувати автоматично, вирішити це було неправильно, додавши їх вручну. Якщо у вас є подібний випадок, скасуйте всі зміни, внесені в Web.Config та у Visual Studio:

  1. Натисніть Ctrl+ Q, введіть nuget і натисніть "Управління пакетами NuGet";
  2. Натисніть Ctrl+ E, введіть провайдерів, і в цьому списку повинно з’явитися « Основні бібліотеки Microsoft ASP.NET Universal Providers » і «Universal ASP.NET Universal Providers for 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. Натисніть, F6щоб скласти, і тепер має бути добре, щоб перейти до оновлення бази даних, не маючи цього винятку:

    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>());

Це працювало для мене. Скажіть, будь ласка, чому, якщо ви голосуєте вниз.
— Огглас

це не працює, тому що вам потрібно передати userid до 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

Ось код, який потрібно ввести у свій контролер облікового запису в MVC5 і пізніше, щоб отримати список ролей користувача:

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

Не потрібно використовувати Roles.GetRolesForUser()та вмикати функцію менеджера ролей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.