Funkcja Menedżera ról nie została włączona

192

Otrzymano następujący wyjątek ProviderException :

Funkcja Menedżera ról nie została włączona.

Na razie w porządku.

Czy istnieje metoda, którą można wywołać w celu sprawdzenia, czy Menedżer ról został włączony, czy nie?

gsharp
źródło

Odpowiedzi:

302

Możesz to zrobić, czytając właściwość boolean pod adresem:

System.Web.Security.Roles.Enabled

Jest to bezpośredni odczyt enabledatrybutu roleManagerelementu w web.config:

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


Aktualizacja:
Aby uzyskać więcej informacji, sprawdź ten przykład MSDN: https://msdn.microsoft.com/en-us/library/aa354509(v=vs.110).aspx

Infotekka
źródło
1
jak mogę to zrobić z kodu zamiast web.config? Próbowałem to włożyć Application_Starti jest napisaneThis method can only be called during the application's pre-start initialization phase.
Masłów
1
Gdzie to idzie w web.config?
Matt Connolly,
17
Po dodaniu powyżej do pliku web.config roleManager jest włączony. Ale teraz dostaję wyjątekUnable to connect to SQL Server database
Irfan Yusanif
2
@Infotekka Błąd „Nie można połączyć się z bazą danych SQL Server”.
Jack
2
wow, to świetna odpowiedź, nawet nie muszę niczego konfigurować, po prostu działa jak urok. Po skonfigurowaniu w pliku web.config mogę po prostu sprawdzić User.Identity.IsAuthenticated, aby sprawdzić, czy użytkownik logowania jest uwierzytelniony. Tak fajne asp.net
Quan
52

Jeśli przyjechałeś tutaj, ponieważ używasz nowego ASP.NET Identity UserManager, to tak naprawdę szukasz RoleManager:

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

roleManager da ci dostęp do sprawdzenia, czy rola istnieje, utwórz itp., a także zostanie ona utworzona dla UserManager

Serj Sagan
źródło
73
Co 3-latek ma z tym wspólnego? Zostałem przeniesiony do tego postu od Google, ponieważ miałem problem z konfiguracją tożsamości. Odkąd to wymyśliłem ... kolejna osoba zajmująca się tym samym problemem, co ja, która zostanie tu sprowadzona przez Google, będzie wiedziała, co robić ...
Serj Sagan
1
Ponadto Identity UserManager ma przydatną funkcję do pobierania ról dla danego użytkownika: UserManager.GetRolesAsync (User.Identity.GetUserId ());
keithl8041,
Gdzie umieścić var ​​roleManager = new RoleManager <IdentityRole> (new RoleStore <IdentityRole> (new ApplicationDbContext ())); ?
Mario M
Możesz to zrobić w dowolnym miejscu aplikacji. Oczywiście będziesz musiał rozwiązać niektóre odwołania, ale wszędzie tam, gdzie potrzebujesz ról w aplikacji Tożsamość, możesz użyć tego oświadczenia.
Serj Sagan,
11

Znalazłem 2 sugestie w innym miejscu za pośrednictwem Google, które sugerowały: a) upewnienie się, że łańcuch połączenia db (ten, którego używa Role) jest poprawny i że klucz do niego jest napisany poprawnie, oraz b) że flaga Enabled w RoleManager jest ustawiona na true. Mam nadzieję, że jedna z nich pomoże. To mi zrobiło.

Próbowałeś sprawdzić Roles.Enabled? Możesz także sprawdzić Roles.Providers, aby zobaczyć, ilu dostawców jest dostępnych, i możesz sprawdzić Roles.Provider dla domyślnego dostawcy. Jeśli ma wartość zero, nie ma go.

Newclique
źródło
Dziękuję za odpowiedź. Ale nie tego chcę. Chcę metody, która sprawdza, czy funkcja Menedżera ról jest włączona, czy nie, bez buforowania wyjątku ProviderException w tym celu.
gsharp,
8

Znalazłem to pytanie ze względu na wspomniany wyjątek. Mój Web.Config nie miał żadnego <roleManager>tagu. Uświadomiłem sobie, że nawet jeśli go dodam (jak sugeruje Infotekka ), skończy się to wyjątkiem bazy danych. Po zastosowaniu się do sugestii zawartych w innych odpowiedziach tutaj żadne z nich nie rozwiązało w pełni problemu.

Ponieważ te tagi Web.Config mogą być generowane automatycznie, rozwiązanie problemu polegało na ich ręcznym dodaniu. Jeśli jesteś w podobnym przypadku, cofnij wszystkie zmiany wprowadzone w Web.Config i Visual Studio:

  1. Naciśnij Ctrl+ Q, wpisz nuget i kliknij „Zarządzaj pakietami NuGet”;
  2. Naciśnij Ctrl+ E, wpisz dostawców, a na liście powinno pojawić się „Microsoft ASP.NET Universal Providers Core Libraries ” i „Microsoft ASP.NET Universal Providers for LocalDB ” (oba utworzone przez Microsoft);
  3. Kliknij przycisk Zainstaluj w obu z nich i zamknij okno NuGet;
  4. Sprawdź Web.config, a teraz powinieneś mieć co najmniej jeden <providers>znacznik wewnątrz znaczników Profile , Membership , SessionState , a także wewnątrz nowego znacznika RoleManager , jak poniżej:

    <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. Dodaj enabled="true"tak:

    <roleManager defaultProvider="DefaultRoleProvider" enabled="true">
  6. Naciśnij, F6aby zbudować, a teraz powinno być OK, aby przejść do aktualizacji bazy danych bez tego wyjątku:

    1. Naciśnij Ctrl+ Q, wpisz manager , kliknij „Console Menedżera pakietów”;
    2. Wpisz update-database -verbosei metoda Seed będzie działać dobrze (jeśli nie pomieszałeś gdzie indziej) i utworzysz kilka tabel w bazie danych;
    3. Naciśnij Ctrl+ W+ L, aby otworzyć Server Explorer i powinieneś być w stanie sprawdzić w Połączenia danych> DefaultConnection> Tabele te role i UsersInRoles stoły wśród nowo utworzonych tabel!
CPHPython
źródło
1
Ponieważ pola Web.Config są generowane automatycznie ” Nie jest to do końca poprawne. Podczas gdy wiele pakietów NuGet automatycznie dostosowuje pliki konfiguracyjne, nie ma ustawionej reguły, która tego wymaga.
Kevin R.
To jest doskonałe. Thnx
sapatelbaps
6

Jeśli używasz, ASP.NET Identity UserManagermożesz również uzyskać to w ten sposób:

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

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

Jeśli na przykład zmieniłeś klucz użytkownika z Guid na Int, użyj tego kodu:

var roles = userManager.GetRoles(User.Identity.GetUserId<int>());
Ogglas
źródło
To zadziałało dla mnie. Powiedz, dlaczego, jeśli głosujesz w dół.
Ogglas,
to nie działa, ponieważ musisz rzutować identyfikator użytkownika na int, taki jak: userManager.GetRoles (Convert.ToInt32 (User.Identity.GetUserId <int> ()));
zabawka
@toy Nie, <int> otrzyma wartość jako int. Nie trzeba konwertować. Oczywiście, aby to zadziałało Kluczem tożsamości musi być int.
Ogglas,
-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>
Michael Goldshmidt
źródło
-1

Oto kod, który należy umieścić w kontrolerze konta w MVC5 i nowszych wersjach, aby uzyskać listę ról użytkownika:

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

Nie ma potrzeby używania Roles.GetRolesForUser()i włączania funkcji Role Manager.

Amneu
źródło