Rollenanbieter / Mitgliedschaft? Wie in asp.net Web API?

8

Ich baue eine asp.net mvc Web-API-Anwendung und nicht sicher, wie man die Mitgliedschaft Sachen.

In meinem aktuellen Projekt habe ich das

Mein eigenes Users Table und Role Table Ich benutze keine asp.net-Mitgliedschaft, da es zu viel Gepäck mit sich bringt und nicht dazu passt, wie ich meine Datenbank gestalten soll (ich kann es zwar, aber es scheint einfach zu viel zu sein Arbeit)

Ein user kann viele Rollen haben und ein role kann viele Benutzer haben.

Ich verwende EF, um fast alle meine Anrufe in die Datenbank zu tun.

In früheren Projekten habe ich mein eigenes Authorize Attribute erstellt, was mein eigener Aufruf an meine Datenbank war, und überprüft, ob der Benutzer in der richtigen Rolle war, was auf dieser Controller / Aktionsmethode erlaubt war.

Indem ich keine Mitgliedschaftsanbieter gemacht habe, habe ich einige der eingebauten Funktionen wie User.IsInRole verloren. Ich konnte User.Identity.Name noch verwenden, aber ich denke, das lag an dem Cookie, den ich gesetzt habe.

Was ist der beste Weg, es jetzt in asp.net mvc 4 / web api zu tun?

Beim googeln habe ich "Simple Membership" gefunden, habe aber noch nicht viel gelesen.

Als Randnotiz kann ich User.Identity.Name mit meinem Webapi verwenden, wenn ich einen Benutzer authentifiziert habe?

    
chobo2 21.05.2013, 20:48
quelle

2 Antworten

4

Hier finden Sie einen Artikel, in dem beschrieben wird, wie ein benutzerdefiniertes authorize-Attribut für das Web erstellt wird APIs verwenden SimpleMembership . Sie müssen SimpleMembership nicht verwenden, obwohl es sehr flexibel und einfach zu verwenden ist. Sie könnten die gleichen Konzepte in diesem Artikel verwenden und stattdessen Ihren Mitgliedschaftsdienst verwenden, solange Ihr Dienst überprüfen kann, ob ein bestimmter Benutzer in einer Rolle ist, einen Benutzer anmelden und seine Identität bestätigen.

Wenn Ihr Dienst nicht bestätigt, dass sie authentifiziert sind, können Sie User.Identity.IsAuthenticated verwenden und Sie können User.Identity.Name verwenden, um den aktuell angemeldeten Benutzernamen abzurufen. Angenommen, Ihr Dienst stellt Thread.CurrentPrincipal korrekt ein, wenn sich ein Benutzer anmeldet. Es wird auch empfohlen, HttpContext.Current.User festzulegen. Natürlich müssen Sie sich darüber keine Gedanken machen, wenn Sie SimpleMembership verwenden.

Dieses benutzerdefinierte Autorisierungsattribut unterstützt sowohl die Formularauthentifizierung als auch die Standardauthentifizierung für den Fall, dass Sie Ihre API der Öffentlichkeit zugänglich machen. Es unterscheidet sich von einem Autorisierungsattribut, das auf einem Controller verwendet wird, darin, dass es einen HTTP-Statuscode von verboten zurückgibt, wenn die nicht autorisiert und nicht autorisiert sind, wenn sie nicht authentifiziert sind; anstatt auf eine Anmeldeseite umzuleiten.

    
Kevin Junghans 22.05.2013, 20:34
quelle
0

Sie können weiterhin einen benutzerdefinierten Mitgliedschaftsanbieter erstellen und nur die Methoden implementieren, die Sie verwenden möchten. Was die User.IsInRole betrifft, könnten Sie einen benutzerdefinierten Rollenanbieter schreiben, indem Sie von der RoleProvider Klasse und registriere sie in deiner web.config.

Und wenn Sie keine dieser integrierten Funktionen verwenden möchten, dann verwenden Sie sie nicht und schreiben stattdessen User.IsInRole write MyService.IsInRole . Es ist wirklich eine Frage der persönlichen Präferenz, ob Sie Ihre benutzerdefinierten Anbieter rollen und die integrierten Funktionen verwenden oder einfach eine Serviceschicht schreiben möchten, die das für Sie erledigt. Ich denke, die Wahl hängt von vielen Faktoren ab, die Sie berücksichtigen sollten und die sich auf die Besonderheiten Ihres Projekts beziehen. Wenn Sie beispielsweise beabsichtigen, andere externe Entwickler an diesem Projekt zu arbeiten, ist es sinnvoller, benutzerdefinierte Mitgliedschafts- und Rollenanbieter zu wählen, da diese Entwickler wahrscheinlich eher mit dieser API vertraut sind als Ihre eigenen Kenntnisse zu erlernen Serviceschicht.

    
Darin Dimitrov 21.05.2013 20:52
quelle