2012-09-14 12 views
10

Avere un momento cieco in codice.Quale provider di appartenenze implementa gli utenti memorizzati in web.config?

ASP.NET 4.0.

web.config:

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <authentication mode="Forms"> 
     <forms name="DataViewer" loginUrl="login.aspx"> 
     <credentials passwordFormat="Clear"> 
      <user name="devuser" password="test" /> 
     </credentials> 
     </forms> 
    </authentication> 
    <authorization> 
     <deny users="?" /> 
    </authorization> 
    </system.web> 

e un controllo login:

<asp:Login ID="login" runat="server" /> 

Se entro in un nome utente e una password, e fare clic su Accesso, si blocca.

Se si interrompe, è possibile vedere nello stack di chiamate che login.AuthenticateUsingMembershipProvider() si trova nel mezzo della chiamata SqlMembershipProvider.ValidateUser(). Non esiste alcun database definito o coinvolto in questo progetto e non ho specificato che SqlMembershipProvider debba essere usato.

Quindi la mia domanda è, quale provider di appartenenza dovrei utilizzare per ottenere ASP.NET per utilizzare i nomi utente e le password nell'elemento <credentials> di web.config?

+0

può essere perché provider predefinito appartenenza è l'AspNetSqlProvider che utilizza un database SQL Server come archivio utente. – Scorpio

+0

Spero che questa sia una soluzione temporanea. Diventerà molto difficile mantenere le credenziali in web.config poiché ogni modifica riavvierà l'applicazione web. – jrummell

+0

Ovviamente. Tuttavia è adatto per lo scenario a portata di mano.Devo fornire una protezione banale a una semplice applicazione per un singolo utente (sempre) la cui password non cambierà mai. Una soluzione con maggiori dipendenze non è appropriata. – tomfanning

risposta

14

Sono sorpreso che, considerando come i progettisti del framework si siano presi la briga di definire un elemento <credentials />, non abbiano implementato alcun codice per consumarlo.

Ho trovato un'implementazione di questo tipo di here che ho riparato e incluso di seguito. Tutti gli altri membri di MembershipProvider lanciano NotImplementedException.

using System.Configuration; 
using System.Web.Configuration; 
using System.Web.Security; 

public class WebConfigMembershipProvider : MembershipProvider 
{ 
    private FormsAuthenticationUserCollection _users = null; 
    private FormsAuthPasswordFormat _passwordFormat; 

    public override void Initialize(string name, 
     System.Collections.Specialized.NameValueCollection config) 
    { 
     base.Initialize(name, config); 
     _passwordFormat = getPasswordFormat(); 
    } 

    public override bool ValidateUser(string username, string password) 
    { 
     var user = getUsers()[username]; 
     if (user == null) return false; 

     if (_passwordFormat == FormsAuthPasswordFormat.Clear) 
     { 
      if (user.Password == password) 
      { 
       return true; 
      } 
     } 
     else 
     { 
      if (user.Password == FormsAuthentication.HashPasswordForStoringInConfigFile(password, 
       _passwordFormat.ToString())) 
      { 
       return true; 
      } 
     } 

     return false; 
    } 

    protected FormsAuthenticationUserCollection getUsers() 
    { 
     if (_users == null) 
     { 
      AuthenticationSection section = getAuthenticationSection(); 
      FormsAuthenticationCredentials creds = section.Forms.Credentials; 
      _users = section.Forms.Credentials.Users; 
     } 
     return _users; 
    } 

    protected AuthenticationSection getAuthenticationSection() 
    { 
     Configuration config = WebConfigurationManager.OpenWebConfiguration("~"); 
     return (AuthenticationSection)config.GetSection("system.web/authentication"); 
    } 

    protected FormsAuthPasswordFormat getPasswordFormat() 
    { 
     return getAuthenticationSection().Forms.Credentials.PasswordFormat; 
    } 
} 
+1

Sei un ragazzo rock! – sbeskur

+0

Prego :-) – tomfanning

+0

Stavo per utilizzare il metodo deprecato FormsAuthentication.Authenticate. Grazie per aver messo la lezione qui. – strider

3

Avrete bisogno di scrivere il proprio provider per questo. Dovrebbe essere relativamente semplice prendere il campione ReadOnlyXmlMembershipProvider nello MSDN documentation e modificarlo per leggere gli utenti e le credenziali da web.config, anziché un file XML esterno.

2

Non sono sicuro se avete provato, ma ....

Il FormsAuthentication.Authenticate è incaricato di farlo per voi (anche se è deprecato ora perché il comportamento consigliato è quello di utilizzare l'iscrizione oggetto)

Da MSDN:

il metodo Authenticate verifica le credenziali dell'utente che sono memorizzati nella sezione credenziali del file di configurazione dell'applicazione. In alternativa, è possibile utilizzare l'appartenenza ASP.NET per memorizzare le credenziali dell'utente e chiamare ValidateUser per verificare le credenziali.

È inoltre possibile rimuovere i provider di appartenenze (perché anche quando non li dichiara il web.config, sono ereditate dal file machine.config)

<membership> 
    <providers> 
     <remove name="AspNetSqlMembershipProvider"/> 
    </providers> 
    </membership> 
Problemi correlati