2009-10-31 12 views
5

Come legare il mio provider di appartenenza personalizzato con il mio attributo ASP.NET MVC [Authorize()]? Ho eseguito una serie di esercitazioni su come creare un provider di appartenenze personalizzato, ma tutte le informazioni che ho trovato su come collegarlo a un'applicazione sembrano ruotare attorno alle normali applicazioni WebForm di ASP.NET che sembrano essere un pezzo di torta.Come posso collegare un provider di appartenenze personalizzato nella mia applicazione ASP.NET MVC?

Mi sto liberando della quantità di "magia" che succede in ASP.NET MVC, che è ottima, ma sono abituata a collegare roba in un modo WebForms quindi questa metodologia "funziona solo" è un po 'di mente per me. Come faccio a sapere quando dovrei fare il sollevamento pesi o dovrei semplicemente fare affidamento su di esso per magia?

Dove si collega il provider a un'app MVC? Ho ragione nel presumere che sia invocato tramite l'attributo [Authorize()] una volta ottenuto il collegamento?

risposta

6

Spero di poter aggiungere un po 'di chiarezza aggiuntiva rispetto alle altre risposte poiché in realtà non spiegano cosa sta succedendo e questo non aiuterà la tua confusione.

Il primo, implementare il provider personalizzato che dal suono delle cose che hai fatto già, quindi mi limiterò a gettare su un piccolo frammento di codice e non voglio entrare in ulteriori dettagli qui:

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 */   
} 

Poi si configura il provider nel web.config avendo cura di compilare gli attributi che configurano il MembershipProvider di base:

<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> 

la prossima po 'penso che stai overthinking, l'attuale tie-in per l'applicazione web . Mentre in un'app WebForms è necessario codificare il resto per conto proprio - il framework MVC fa il resto per te - tutto ciò che devi fare è aggiungere l'attributo [Authorize] al tuo metodo di azione e il framework controllerà se sei tu sei loggato e se non ti reindirizza alla pagina di accesso. La pagina di login troverete il vostro provider personalizzato, perché questo è ciò che è configurato nel web.config e registrerà l'utente in È possibile accedere alle informazioni relative l'utente connesso dei controller facendo riferimento alla utente oggetto:.

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

Quindi questa azione richiede che l'utente abbia effettuato il login e presenti le informazioni dell'utente alla vista Whatever/WhateverAction.aspx per essere visualizzate sulla pagina.

+0

Ok, questo ha senso - grazie per averlo chiarito. Non stavo mettendo insieme due e due. Sono ancora bloccato in questo stato d'animo di WebForms e non ho capito quando MVC lo fa per me e quando devo gestirlo per me stesso. – BobTheBuilder

0

Quanto è cambiato in questo abbonamento personalizzato? Come hai cambiato i nomi dei tavoli? Puoi accedere agli utenti e cose del genere? Cioè il tuo abbonamento personalizzato funziona?

Se hai cambiato un sacco di cose in giro come hai cambiato il nome della tabella dei ruoli in qualcosa di diverso o roba del genere, allora dovrai sovrascrivere il tag Authroize.

Tuttavia, se la tua iscrizione personalizzata non funziona, probabilmente non l'hai configurata correttamente e la configurazione è la stessa dei moduli web. Devi solo configurare il tuo webconfig.

</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

Quando dici "cosa abbiamo cambiato e cose del genere", non abbiamo modificato nulla, stiamo utilizzando un database utente esistente, non quello che la procedura guidata ASP.NET MVC imposta per te .. e ad essere onesti, non abbiamo intenzione di utilizzare il tutorial, è molto più complesso del necessario per le nostre esigenze e non soddisfa le esigenze del nostro modello di business. Quindi abbiamo scritto un provider di appartenenze ... la cosa di cui sono all'oscuro è come aggancia il mio fornitore personalizzato che ho specificato nel web.config nella codebase della mia applicazione web? – BobTheBuilder

+0

Bene tutto ciò che ti ho dato è quello che usi per configurare un database personalizzato con un fornitore personalizzato. Potresti elencare le tabelle che usi come stai usando aspnet_UserInRoles? aspnet_user e qualsiasi tabella che è preceduta da aspnet? – chobo2

1

mio provider di appartenenze personalizzato viene fatto riferimento nel web.config:

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

poi basta usare classe Membership statica.

+0

Fresco: cosa devi impedire di specificare i multipli in web.config e in che modo nella mia applicazione Web vengono attivati? – BobTheBuilder

+0

In realtà sei in grado di specificare più provider di appartenenze. Questa è la ragione per cui devi specificare il DefaultProvider. Ritengo che l'utilità di più provider sia vista solo in complessi meccanismi di autorizzazione. Ma per ottenere un elenco dei provider nel codice, è sufficiente utilizzare la proprietà System.Web.Security.Membership.Providers che restituisce una raccolta di provider di appartenenze specificata nel web.cofig. – zowens

+0

come ha scritto zowens. In realtà, è possibile creare un'istanza del proprio provider noto solo per la normale MembershipProvider mp = new MyMembershipProvider(); o recuperandolo dall'elenco restituito da Membership.Providers – twk

Problemi correlati