2009-10-31 5 views
5

Wie verknüpfe ich meinen benutzerdefinierten Mitgliedschaftsanbieter mit meinem ASP.NET MVC [Authorize()] - Attribut? Ich habe eine Reihe von Tutorials für die Erstellung eines benutzerdefinierten Mitgliedschaftsanbieters durchgestreift, aber alle Informationen, die ich über die Verknüpfung mit einer Anwendung gefunden habe, scheinen sich um reguläre ASP.NET WebForms-Anwendungen zu drehen, die scheinbar ein Stück sind Kuchen.Wie kann ich einen benutzerdefinierten Mitgliedschaftsanbieter in meiner ASP.NET MVC-Anwendung anhängen?

Ich komme mit der Menge an "Magie", die gerade in ASP.NET MVC passiert, was großartig ist, aber ich bin es gewohnt, Sachen in einer WebForms Weise zu verstopfen, so dass diese "es funktioniert einfach" -Methodik ist ein bisschen Verstand für mich. Woher weiß ich, wann ich das schwere Heben durchführen soll oder soll ich mich darauf verlassen, dass es durch Magie geschieht?

Wo binde ich meinen Provider in eine MVC App ein? Habe ich recht, wenn ich annehme, dass es über das [Authorize()] - Attribut aufgerufen wird, sobald ich es angeschlossen habe?

Antwort

6

Hoffentlich kann ich etwas mehr Klarheit über die anderen Antworten hinzufügen, da sie wirklich nicht erklären, was vor sich geht, was Ihrer Verwirrung nicht helfen wird.

First up, implementieren Ihre benutzerdefinierten Anbieter die aus dem Klang der Dinge, die Sie haben bereits getan, so dass ich nur ein wenig Code-Schnipsel werfen und nicht in weiteren Einzelheiten gehen Sie hier:

using System.Web.Security; 

public class MyCustomMembershipProvider : MembershipProvider 
{ 
    public override bool ValidateUser(string username, string password) 
    { 
     if (username.Equals("BenAlabaster") && password.Equals("Elephant")) 
      return true; 

     return false; 
    } 

    /* Override all the other methods required to extend MembershipProvider */   
} 
Sie Grübeln, die tatsächliche tie-in, um Ihre Web-Anwendung

<membership defaultProvider="MyCustomMembershipProvider">  
    <providers>   
     <clear />   
     <add name="MyCustomMembershipProvider" 
      type="MyNamespace.MyCustomMembershipProvider" 
      enablePasswordRetrieval="false" 
      enablePasswordReset="true"   
      requiresQuestionAndAnswer="false"   
      requiresUniqueEmail="true"   
      passwordFormat="Hashed"   
      maxInvalidPasswordAttempts="10"   
      minRequiredPasswordLength="6"   
      minRequiredNonalphanumericCharacters="0"   
      passwordAttemptWindow="10"   
      passwordStrengthRegularExpression=""   
      applicationName="/" />  
    </providers>  
</membership> 

das nächste Bit denke ich:

Dann konfigurieren Sie Ihren Anbieter in Ihrer web.config sicherstellen, dass die Attribute aufzufüllen, die die Basis MembershipProvider konfigurieren . Während Sie in einer WebForms-App den Rest für sich selbst codieren müssen - das MVC-Framework erledigt den Rest für Sie - müssen Sie lediglich das Attribut [Autorisieren] zu Ihrer Aktionsmethode hinzufügen, und das Framework prüft, ob Sie das tun Sie sind eingeloggt und leiten Sie nicht zur Anmeldeseite weiter. Die Login-Seite wird Ihre benutzerdefinierten Anbieter finden, weil das ist, was in der web.config konfiguriert ist, und wird in Ihrem Benutzer anmelden Sie Informationen über den angemeldeten Benutzer von Ihrem Controller durch Bezugnahme auf den Benutzer Objekt zugreifen können.

public class WhateverController : Controller 
{ 
    [Authorize] 
    public ActionResult WhateverAction() 
    { 
     ViewData["LoggedInAs"] = string.Format("You are logged in as {0}.", User.Identity.Name); 
     Return View(); 
    } 
} 

Für diese Aktion ist also erforderlich, dass der Benutzer angemeldet ist und die Benutzerinformationen für die Ansicht Whatever/Whate- tAction.aspx auf der Seite anzeigt.

+0

Okay, das macht Sinn - danke, dass du das geklärt hast. Ich habe einfach nicht zwei und zwei zusammen gesetzt. Ich bin immer noch in dieser WebForms Geisteshaltung gefangen und habe nicht herausgefunden, wenn MVC es für mich macht und wenn ich es für mich selbst handhaben muss. – BobTheBuilder

0

Wie viel haben Sie an dieser benutzerdefinierten Mitgliedschaft geändert? Wie hast du Tabellennamen geändert? Können Sie Benutzer anmelden und so? Dh funktioniert Ihre benutzerdefinierte Mitgliedschaft?

Wenn Sie viele Dinge geändert haben, wie Sie den Namen der Rollentabellen in etwas anderes oder ähnliches geändert haben, dann müssen Sie das Authoize-Tag überschreiben.

Wenn Ihre benutzerdefinierte Mitgliedschaft jedoch nicht funktioniert, haben Sie wahrscheinlich nicht richtig konfiguriert und die Konfiguration ist die gleiche wie in Webforms. Sie müssen nur Ihr Webconfig einrichten.

</authentication> 
    <membership> 
     <providers> 
     <clear /> 
     <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ConnectionString" 
     enablePasswordRetrieval="false" 
     enablePasswordReset="true" 
      requiresQuestionAndAnswer="false" 
      requiresUniqueEmail="true" 
      passwordFormat="Hashed" 
      maxInvalidPasswordAttempts="10" 
      minRequiredPasswordLength="6" 
      minRequiredNonalphanumericCharacters="0" 
      passwordAttemptWindow="10" 
      passwordStrengthRegularExpression="" 
      applicationName="/" /> 
     </providers> 
    </membership> 
    <profile> 
     <providers> 
     <clear /> 
     <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ConnectionString" applicationName="/" /> 
     </providers> 
    </profile> 
    <roleManager enabled="true"> 
     <providers> 
     <clear /> 
     <add connectionStringName="ConnectionString" 
      applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
     <add applicationName="/" name="AspNetWindowsTokenRoleProvider" 
      type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
     </providers> 
    </roleManager> 
+0

Wenn Sie sagen: "Was haben wir geändert und so", haben wir nichts geändert, wir verwenden eine vorhandene Benutzerdatenbank, nicht die, die der ASP.NET MVC-Assistent für Sie eingerichtet hat. und um ehrlich zu sein, haben wir nicht die Absicht, das Tutorial zu verwenden, es ist viel komplexer als für unsere Bedürfnisse notwendig und entspricht nicht den Anforderungen unseres Geschäftsmodells. Also haben wir einen Mitgliedschaftsanbieter geschrieben ... Was ich nicht weiß, ist, wie er meinen benutzerdefinierten Anbieter, den ich in der web.config angegeben habe, in die Codebasis meiner Webanwendung einklinke? – BobTheBuilder

+0

Nun, alles, was ich Ihnen gab, ist, was Sie verwenden, um eine benutzerdefinierte Datenbank mit einem benutzerdefinierten Anbieter einzurichten. Können Sie die Tabellen auflisten, die Sie verwenden, wie verwenden Sie aspnet_UserInRoles? aspnet_user und jede Tabelle mit dem Präfix aspnet? – chobo2

1

Mein benutzerdefinierten Mitgliedschaftsanbieter ist in der web.config verwiesen:

<membership defaultProvider="MyMembershipProvider"> 
    <providers> 
    <clear/> 
    <add name="MyMembershipProvider" type="Namespace.MyMembershipProvider, Namespace" connectionStringName="connstring" [...] /> 
    </providers> 
</membership> 

Verwenden Sie dann nur statische Membership-Klasse.

+0

Cool - was hält Sie davon ab, in der web.config ein Vielfaches anzugeben und wo in meiner Webapplikation zieht es sie in Aktion? – BobTheBuilder

+0

Sie können tatsächlich mehrere Mitgliedschaftsanbieter angeben. Aus diesem Grund müssen Sie den defaultProvider angeben. Ich habe den Eindruck, dass der Nutzen mehrerer Anbieter nur in komplexen Autorisierungsmechanismen zu sehen ist. Um jedoch die Anbieter in Code aufzulisten, verwenden Sie einfach die System.Web.Security.Membership.Providers-Eigenschaft, die eine Auflistung von Mitgliedschaftsanbietern zurückgibt, die in web.cofig angegeben sind. – zowens

+0

wie zowens schrieb. Tatsächlich können Sie Ihren eigenen bekannten Provider nur durch normal instanziieren MembershipProvider mp = new MyMembershipProvider(); oder indem man es von der Liste erhält, die von Membership.Providers – twk

Verwandte Themen