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?
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?
Odpowiedzi:
Możesz to zrobić, czytając właściwość boolean pod adresem:
System.Web.Security.Roles.Enabled
Jest to bezpośredni odczyt enabled
atrybutu roleManager
elementu 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
roleManager
jest włączony. Ale teraz dostaję wyjątekUnable to connect to SQL Server database
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
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.
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:
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>
Dodaj enabled="true"
tak:
<roleManager defaultProvider="DefaultRoleProvider" enabled="true">
Naciśnij, F6aby zbudować, a teraz powinno być OK, aby przejść do aktualizacji bazy danych bez tego wyjątku:
update-database -verbose
i metoda Seed będzie działać dobrze (jeśli nie pomieszałeś gdzie indziej) i utworzysz kilka tabel w bazie danych;Jeśli używasz, ASP.NET Identity UserManager
moż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>());
<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>
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.
web.config
? Próbowałem to włożyćApplication_Start
i jest napisaneThis method can only be called during the application's pre-start initialization phase.