2012-04-07 4 views
0

Ich versuche, Rollen für meine Formularauthentifizierung zu verwenden, ich habe die global.asax Application_AuthenticateRequest-Methode erhalten die Rollen aus dem Cookie, das funktioniert gut. Aber ich weiß nicht welchen Provider in Web.Config zu konfigurieren ist. Ich möchte keinen SQL-Server verwenden, nur den Cookie.ASP.NET MVC3 Rollenauthentifizierung mit Cookie und keine SQL?

diese Linie erzeugt die IPrincipal: (Rollen ist ein String-Array mit den Rollen)

Context.User = new GenericPrincipal(Context.User.Identity, roles); 

Das Endziel ist DataAnnotations wie [autorisieren (Roles = "Admin")] und der IsInRole Methode zum Laufen zu bringen .

Auch die IsInRole-Methode funktioniert gut, wenn sie in der global.asax verwendet wird, aber nicht an anderer Stelle. Warum nicht?

Web.config wird als solches konfiguriert ist, um jetzt:

<roleManager defaultProvider="DefaultRoleProvider" cacheRolesInCookie="true"> 

und die default ist leider zu einem gewissen Leer SQL-DB für keinen wirklichen Grund, verbunden.

Ist das überhaupt möglich?

Danke.

+0

Getting die Rollen aus dem Cookie hier den Code aus der zweiten Antwort mit: http://stackoverflow.com/questions/1385042/asp-net-mvc-forms-authentication-authorize-attribute-simple-roles – Michael

+0

Es wurde ein Fehler im Visual Studio oder etwas verursacht das Problem verursacht. Der Code aus dem Post, den ich oben erwähnt habe, funktioniert so wie er ist, wenn an der Webanwendung nichts falsch ist. – Michael

Antwort

0

Eine bessere Alternative könnte die ASP.NET XmlProviders sein. (Keine Datenbank)

Oder wenn Sie nicht nur eine SQL-Service-Instanz haben möchten, sondern die Vorteile einer Datenbank verwenden möchten, verwenden Sie ErikJ's Sql CE MembershipProvider/RoleProviders. (Der Blog erwähnt, dass CE 4.0 nicht produktionsbereit ist, aber das war lange her und kann jetzt in kleineren Produktionsumgebungen verwendet werden).

UPDATE

Sie könnten sicherlich Rolle Ihre eigene AuthroizeAttribute und außer Kraft setzen OnAuthorize auf einem Attribut Klasse abgeleitet autorisieren.

+0

Beide scheinen mir ein Overkill, oder? Ich versuche nur die Rolle im Principal zu benutzen. Gibt es nicht bereits eine einfache Lösung in ASP.NET? – Michael

+0

Nein. Ohne einen Benutzer/eine Mitgliedschaft, die Rollen zugewiesen haben, wie würden Sie wissen, wer in welcher Rolle ist? Ich bin kein Fan davon, ein Rad zu entwickeln, das gut funktioniert.Ich habe persönlich die CE-Version auf kleineren Websites ohne Probleme verwendet und nutze den vollen Nutzen der Anbieter (weniger Arbeiten am Login-Material, mehr Arbeit an tatsächlichen Kundenbedürfnissen). –

+0

Ihr Update könnte der richtige Weg sein, aber ich bin mir nicht sicher, wie es weitergehen soll. Auch wenn ich die Methode IsInRole innerhalb der global.asax verwende - es funktioniert! aber es wird nicht an anderer Stelle verwendet. Was kann falsch sein? – Michael

0

Sie benötigen keinen eigenen Anbieter basierend auf dem, was Sie gesagt haben. So können Sie lesen und einfach eine Authentifizierungsanfrage stellen.

Jetzt ist die Frage, wo Sie sie speichern möchten. Wie möchten Sie sie speichern? Werden Sie sie nur in den Cookie setzen? Sicherlich gibt es einen dauerhaften Speicher, den du behalten willst, sonst, wenn der Cookie weg ist, wie aktualisierst du ihre Rollen?

+0

Ich brauche kein Geschäft, wenn der Cookie abläuft, ist der Benutzer sowieso out. Wenn sie sich erneut anmelden, erhalten sie einen neuen Cookie mit den Rollendaten. Was kann ich mit einer Authentifizierungsanfrage tun? – Michael

+0

Wo sind Ihre Rollen gespeichert? –

+0

Wenn ich den Cookie für den Benutzer erstelle, hat er die Rolle und der Application_AuthenticateRequest ruft ihn ab. Ich verwende den Code aus der zweiten Antwort auf diesen Beitrag: http://stackoverflow.com/questions/1385042/asp-net-mvc-forms-authentication-authorize-attribute-simple-roles – Michael

0

Warum verwenden Sie nicht einfach den integrierten Rollenanbieter und geben Sie an, dass Rollen im Cookie zwischengespeichert werden. Sie haben also nur einen einzigen Datenbankanruf bei der Anmeldung und danach werden sie automatisch in einem Cookie gespeichert.

<roleManager defaultProvider="DefaultRoleProvider" cacheRolesInCookie="true"> 
+0

Das mache ich schon, so sieht meine web.config aus. Aber es funktioniert nicht :( – Michael

+0

@Michael - und woher weißt du, dass es nicht funktioniert? –

+0

Weil ich "falsch" für IsInRole-Methode bekomme. Und Autorisieren mit Rollen DataAnnotations funktioniert auch nicht. – Michael