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


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.