Die Rollenmanagerfunktion wurde nicht aktiviert

192

Erhielt die folgende ProviderException :

Die Rollenmanagerfunktion wurde nicht aktiviert.

So weit, ist es gut.

Gibt es irgendwo eine Methode, mit der überprüft werden kann, ob der Rollenmanager aktiviert wurde oder nicht?

gsharp
quelle

Antworten:

302

Sie können dies tun, indem Sie aus der booleschen Eigenschaft unter folgender Adresse lesen:

System.Web.Security.Roles.Enabled

Dies ist ein direkter Lesevorgang aus dem enabledAttribut des roleManagerElements in web.config:

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


Update:
Weitere Informationen finden Sie in diesem MSDN-Beispiel: https://msdn.microsoft.com/en-us/library/aa354509(v=vs.110).aspx

Infotekka
quelle
1
Wie kann ich das aus Code machen anstatt web.config? Ich habe versucht, es einzulegen Application_Startund es heißtThis method can only be called during the application's pre-start initialization phase.
Maslow
1
Wohin geht das in web.config?
Matt Connolly
17
Nach dem Hinzufügen oben zu web.config roleManager ist aktiviert. Aber jetzt Unable to connect to SQL Server database
bekomme
2
@Infotekka Fehler "Verbindung zur SQL Server-Datenbank kann nicht hergestellt werden" Fehler.
Jack
2
wow, das ist eine großartige Antwort, ich muss nicht einmal etwas konfigurieren, funktioniert einfach wie ein Zauber. Nach der Konfiguration in web.config kann ich einfach User.Identity.IsAuthenticated überprüfen, um festzustellen, ob ein angemeldeter Benutzer authentifiziert ist. So cool asp.net
Quan
52

Wenn Sie hierher gekommen sind, weil Sie das Neue verwenden ASP.NET Identity UserManager, suchen Sie tatsächlich Folgendes RoleManager:

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

roleManager Sie erhalten Zugriff darauf, ob die Rolle vorhanden ist, erstellt usw. wird und für die Rolle erstellt wurde UserManager

Serj Sagan
quelle
73
Was hat der 3-Jährige mit irgendetwas zu tun? Ich wurde von Google zu diesem Beitrag weitergeleitet, weil ich ein Problem beim Einrichten der Identität hatte. Da ich es herausgefunden habe ... wird die nächste Person, die sich mit dem gleichen Problem wie ich befasst und von Google hierher gebracht wird, wissen, was zu tun ist ...
Serj Sagan
1
Der Identity UserManager verfügt außerdem über eine nützliche Funktion zum Abrufen von Rollen für den angegebenen Benutzer: UserManager.GetRolesAsync (User.Identity.GetUserId ());
keithl8041
Wo setzen Sie var roleManager = new RoleManager <IdentityRole> (neuer RoleStore <IdentityRole> (neuer ApplicationDbContext ())); ?
Mario M
Sie können es überall in der App tun. Sie müssen natürlich einige Referenzen auflösen, aber überall dort, wo Sie Rollen in einer Identitäts-App benötigen, können Sie diese Anweisung verwenden.
Serj Sagan
11

Ich habe an anderer Stelle über Google zwei Vorschläge gefunden, die vorschlugen: a) sicherzustellen, dass Ihre Datenbank-Verbindungszeichenfolge (die von Roles verwendete) korrekt ist und dass der Schlüssel dazu richtig geschrieben ist, und b) dass das Flag "Aktiviert" in RoleManager auf "true" gesetzt ist. Hoffe einer davon hilft. Es hat für mich getan.

Haben Sie versucht, Roles.Enabled zu überprüfen? Sie können auch Roles.Providers überprüfen, um festzustellen, wie viele Anbieter verfügbar sind, und Sie können den Roles.Provider für den Standardanbieter überprüfen. Wenn es null ist, gibt es keine.

Newclique
quelle
Danke für deine Antwort. Aber es ist nicht was ich will. Ich möchte eine Methode, die überprüft, ob die Rollenmanagerfunktion aktiviert ist oder nicht, ohne die ProviderException für diesen Zweck zwischenzuspeichern.
Gsharp
8

Ich fand diese Frage aufgrund der darin erwähnten Ausnahme. Meine Web.Config hatte kein <roleManager>Tag. Ich erkannte, dass selbst wenn ich es hinzufügte (wie Infotekka vorschlug ), es in einer Datenbankausnahme endete. Nachdem Sie den Vorschlägen in den anderen Antworten hier gefolgt sind, hat keiner das Problem vollständig gelöst.

Da diese Web.Config-Tags automatisch generiert werden können, war es falsch, sie durch manuelles Hinzufügen zu lösen. Wenn Sie sich in einem ähnlichen Fall befinden, machen Sie alle Änderungen rückgängig, die Sie an Web.Config und in Visual Studio vorgenommen haben:

  1. Drücken Sie Ctrl+ Q, Typ nuget und klicken Sie auf "Manage NuGet Packages";
  2. Drücken Sie Ctrl+ E, geben Sie Provider ein und in der Liste sollten "Microsoft ASP.NET Universal Providers Core Libraries " und "Microsoft ASP.NET Universal Providers für LocalDB " (beide von Microsoft erstellt) angezeigt werden .
  3. Klicken Sie in beiden Fällen auf die Schaltfläche Installieren und schließen Sie das NuGet-Fenster.
  4. Überprüfen Sie Ihre Web.config und jetzt sollten Sie mindestens ein <providers>Tag in den Tags Profil , Mitgliedschaft , SessionState und auch im neuen RoleManager- Tag haben, wie folgt :

    <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. Fügen Sie enabled="true"wie folgt hinzu:

    <roleManager defaultProvider="DefaultRoleProvider" enabled="true">
  6. Drücken Sie F6auf Erstellen, und jetzt sollte es in Ordnung sein, mit einer Datenbankaktualisierung fortzufahren, ohne diese Ausnahme zu haben:

    1. Drücken Sie Ctrl+ Q, geben Sie manager ein und klicken Sie auf "Package Manager Console".
    2. Type update-database -verboseund die Seed-Methode funktionieren einwandfrei (wenn Sie nicht an anderer Stelle herumgespielt haben) und erstellen einige Tabellen in Ihrer Datenbank.
    3. Drücken Sie Ctrl+ W+ Lden Server - Explorer zu öffnen , und Sie sollten in der Lage sein zu überprüfen , Datenverbindungen> DefaultConnection> Tabellen die Rollen und UsersInRoles Tabellen unter den neu erstellten Tabellen!
CPHPython
quelle
1
" Da Web.Config-Felder automatisch generiert werden " Dies ist nicht ganz richtig. Während viele NuGet-Pakete die Konfigurationsdateien automatisch anpassen, gibt es keine festgelegte Regel, die dies erfordert.
Kevin R.
Dies ist perfekt. Thnx
sapatelbaps
6

Wenn Sie verwenden ASP.NET Identity UserManager, können Sie es auch so bekommen:

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

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

Wenn Sie beispielsweise den Schlüssel für den Benutzer von Guid in Int geändert haben, verwenden Sie diesen Code:

var roles = userManager.GetRoles(User.Identity.GetUserId<int>());
Ogglas
quelle
Das hat bei mir funktioniert. Bitte sagen Sie warum, wenn Sie abstimmen.
Ogglas
Dies funktioniert nicht, da Sie userid in int umwandeln müssen, sodass: userManager.GetRoles (Convert.ToInt32 (User.Identity.GetUserId <int> ()));
Spielzeug
@toy Nein, <int> erhält den Wert als int. Keine Notwendigkeit zu konvertieren. Damit dies funktioniert, muss der Identitätsschlüssel natürlich int sein.
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
quelle
-1

Hier ist der Code, den Sie in MVC5 und höher in Ihren Account Controller eingeben müssen, um die Liste der Rollen eines Benutzers abzurufen:

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

Die Rollenmanagerfunktion muss nicht verwendet Roles.GetRolesForUser()und aktiviert werden.

Amneu
quelle