4 Stimmen

Bester Ansatz für Benutzerrollen in einer Intranet-Anwendung

Ich entwickle eine ASP.NET MVC-Intranet-Website, die einige verschiedene Benutzerrollen haben muss (Admin, Redakteur, Autor usw.), und das Backend verwendet SQL Server. Ich lese diese Stelle von scottgu über rollenbasierte Sicherheit und nutzte dies als Ausgangspunkt. Die Schritte, die ich befolgt habe, waren:

Konfigurieren Sie eine DB mit der Anwendung asp_regsql.exe Setzen Sie den Authentifizierungsmodus auf Windows

<authentication mode = "Window" />

Hinzufügen eines Eintrags für die Verbindungszeichenfolge in der Web.config,

<connectionStrings>
  <add name="SqlRoleManagerConnection" 
       connectionString="Data Source=localhost; Initial Catalog=aspservicedb; Integrated Security=SSPI;" />
</connectionStrings>

Der Web.config-Sektion wurde ein roleManager-Eintrag hinzugefügt,

<roleManager enabled="true" defaultProvider="sqlRoleManager">
  <providers>
    <clear />
    <add name="sqlRoleManager" type="System.Web.Security.SqlRoleProvider"
         connectionStringName="SqlRoleManagerConnection"
         applicationName="MyApplication" />
  </providers>
</roleManager>

In die Methode Application_Start() der Datei Global.asax.cs wurde ein Rollencode eingefügt,

if (!Roles.RoleExists("Editor"))
{
   Roles.CreateRole("Editor");
}
if (!Roles.RoleExists("Writer"))
{
   Roles.CreateRole("Writer");
}
if (!Roles.RoleExists("SiteAdmin"))
{
   Roles.CreateRole("SiteAdmin");
   Roles.AddUserToRole("MYCOMPUTER\\Matt", "SiteAdmin");
}

Ich habe meine Controller geändert, um die Rollen zu verwenden:

[Authorize(Roles = "SiteAdmin")]
public class SiteAdminController : Controller
{
    .
    .
    .
}

Und das alles scheint im Moment zu funktionieren, aber ich frage mich, ob es einen besseren Ansatz für die Rollenverteilung gibt oder ob es Probleme mit diesem Ansatz gibt. Es ist leicht, sich davon zu überzeugen, dass der Ansatz gut ist, weil er funktioniert hat, aber ich würde gerne einen anderen Ansatz wählen jetzt eher als später, wenn dies nicht der beste Ansatz zur Lösung des Problems ist. An anderer Stelle habe ich gelesen, dass jemand sagte, dies sei ein "Hack", aber er hat nie wirklich begründet, warum er das Problem nicht auf diese Weise lösen würde. Ihre Meinung? Haben Sie eine bessere Lösung für dieses Problem?

3voto

Adam Tuliper Punkte 29789

In einigen meiner MVC-Produktionsanwendungen verwende ich einfach den eingebauten Sql-Rollenanbieter. Es funktioniert out of the box, Ihre MVC3-Vorlagen werden konfiguriert, um es bereits zu verwenden. Öffnen Sie einfach die Admin-Site von innerhalb von Visual Studio und verwalten Sie die Sicherheit und fügen Sie Ihre Rollen, Benutzer, Benutzer zu Rollen, etc. und das ist es. Verwenden Sie nicht Ihre web.config zu verwalten, welche Rollen haben Zugriff auf welche URIs, wurde dies immer wieder empfohlen, weg von in MVC als mehr als eine uri könnte potenziell auf eine einzige Route zu erhalten, so dass Sie verwenden (wie Sie haben) das Attribut Authorize in Verbindung mit der automatischen Rollenverwaltung, und das ist alles, was Sie brauchen. Es ist ziemlich einfach.

2voto

Milimetric Punkte 13196

Nun, es gibt zwei erwähnenswerte Alternativen:

  1. Konfigurieren Sie Ihre rollenbasierte Sicherheit direkt in der Webkonfiguration. Dadurch wird Ihre Sicherheitskonfiguration zentralisiert, obwohl sie aktualisiert werden muss, um Ihre Pfade/Routing zu spiegeln, was ein wenig manuelle Wartung erfordert.
  2. Konfigurieren Sie Ihre rollenbasierte Sicherheit in der Datenbank und erstellen Sie benutzerdefinierte Aktionsfilter zum Lesen, Zwischenspeichern und Anwenden dieser Rollen auf der Grundlage des angemeldeten Benutzers. Dies ist dynamisch, aber ein wenig aufwändiger, da Sie wahrscheinlich einen Admin-Bildschirm erstellen müssen, um die Konfiguration zu bearbeiten.

Lassen Sie mich wissen, wenn Sie Beispiele benötigen, und ich kann Ihnen einen Link schicken.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X