3

Gibt es eine Möglichkeit RoleId zu erhalten, ohne direkt von der DB erhalten ?, Ich weiß, wir können durch Rollennamen erhalten:Wie Erhalten RoleID in ASP.NET MVC

string[] allRoles = System.Web.Security.Roles.GetAllRoles(); 
string[] allRolesForUser = System.Web.Security.Roles.GetRolesForUser(httpContext.User.Identity.Name); 

Aber ich brauche RoleID zuzugreifen.

Hat jemand eine Ahnung davon?

+0

Die Rollen-API bietet keine Möglichkeit zum Abrufen von Rollen-IDs. Ich nehme an, Sie könnten einen benutzerdefinierten Rollenanbieter erstellen. – Tuan

Antwort

2

Nein. Der Rollenanbieter hat keine Kenntnisse über die Datenquelle. Es kann ein sehr langsamer Webdienst oder eine super Deluxe NoSQL-Datenbank sein. Der Provider weiß nicht, dass Ihre db als Primärschlüssel gilt.

Sicher. Die SqlMembershipProvider tut. Aber wenn er den Schlüssel offen legt, würde dies wahrscheinlich zu Verstößen gegen Liskovs Substitution Principle führen.

Der Rollenname sollte eindeutig sein. Sie sollten es also selbst aus der Datenbank holen können. Oder warum können Sie nicht einfach den Rollennamen anstelle des db-Schlüssels verwenden?

+0

ASP.NET Role Manager hat einen Fehler. Obwohl eine doppelte Rolle nicht erlaubt ist, wenn die Rolle Zwischenräume hat und verschiedene Leerstellen für verschiedene Rollen verwendet, sind sie erlaubt, schließlich sind mehrere Rollen mit demselben Namen erlaubt! –

+0

Der Fehler besteht darin, dass Sie Leerzeichen zulassen. – jgauffin

+0

aber .NET sollte mehrere Leerzeichen löschen und validieren! –

0

Sie können nicht. ASP.NET MVC erlaubt nicht, RoleId mit Standardfunktion zu bekommen, Sie müssen es von der Datenbank mit Hilfe des Rollennamens holen.

2

Sie müssen Ihrem Modell die aspnet_Roles-Tabelle hinzufügen und eine Abfrage (z. B. LINQ) verwenden, um die Rollen-ID abzurufen. Sie können MembershipProvider ändern, aber dafür ist mehr Arbeit erforderlich.

0

Ich weiß, das ist ein paar Jahre alt, aber als ich stieß ich sah, dass niemand beantwortet wirklich vollständig beantwortet die Frage ... so dachte ich, ich würde eine vollständige Lösung posten.

Soooo ...

Einfach gesagt:

SELECT RoleId, RoleName FROM aspnet_Roles; 
GO 

Aber für RoleIds für einen Benutzer immer ist es so:

SELECT UR.RoleID, R.RoleName FROM 
aspnet_Users U, aspnet_Roles R, aspnet_UsersInRoles UR 
WHERE U.UserName = @Username 
AND UR.UserId = U.UserId 
AND UR.RoleID = R.RoleId 
GO 

Dies wird Ihnen eine 2 Spaltenliste RoleIds und RoleNames für einen bestimmten Benutzer.

In Wirklichkeit sollten Sie nicht versuchen, dies zu tun, da es eine Sicherheitsverletzung gibt, wenn eine RoleId offengelegt wird. Sie sollten nur mit RoleNames arbeiten und die Elemente Mitgliedschaft und Rollen verwenden, um Dinge zu verwalten.

Hoffen, dass dies hilft :)