2012-12-21 10 views
6

Attualmente sto scrivendo un provider di appartenenza personalizzato per asp .net e il problema che sto avendo è che non so come dare parametri al provider di appartenenza personalizzato nel allo stesso modo che si danno ai provider di appartenenza asp .net standard nel file web.config come la lunghezza della password.Asp .Net Parametri di appartenenza personalizzati da web.config

risposta

5

Quando si deriva la propria classe da MembershipProvider si deve eseguire l'override del metodo Initialize(), ha seguente firma:

public override void Initialize(string name, NameValueCollection config); 

Il System.Collections.NameValueCollection è un dizionario in cui trovare le opzioni scritte nel file web.config. Queste opzioni sono fornite nello stesso modo in cui si specificano le opzioni per i provider "standard" (come attributi). Ogni voce del dizionario ha la chiave del nome dell'attributo e come valore il valore dell'attributo (come string).

public class MyMembershipProvider : MembershipProvider 
{ 
    public override void Initialize(string name, NameValueCollection config) 
    { 
     base.Initialize(name, config); 

     _enablePasswordReset = config.GetBoolean("enablePasswordReset", true); 
    } 
} 

Dove, nel mio esempio, GetBoolean() è un metodo di estensione dichiarato da qualche parte come segue:

public static bool GetBoolean(this NameValueCollection config, 
    string valueName, bool? defaultValue) 
{ 
    object obj = config[valueName]; 
    if (obj == null) 
    { 
     if (!defaultValue.HasValue) 
      throw new WarningException("Required field has not been specified."); 

     return defaultValue.Value; 
    } 

    bool value = defaultValue; 
    if (obj is Boolean) 
     return (bool)obj; 

    IConvertible convertible = obj as IConvertible; 
    try 
    { 
     return convertible.ToBoolean(CultureInfo.InvariantCulture); 
    } 
    catch (Exception) 
    { 
     if (!defaultValue.HasValue) 
      throw new WarningException("Required field has invalid format."); 

     return defaultValue.Value; 
    } 
} 
+1

Questo è esattamente come l'ho fatto in passato, dopo aver chiamato 'base.Initialize' riempi i rimanenti valori di configurazione, impostando i valori predefiniti adatti o generando eccezioni come necessario per i parametri obbligatori mancanti. –

2

Se il proprio provider deriva da MembershipProvider : ProviderBase, è necessario caricare tutta la configurazione e applicare il modulo web.config.

Considerare l'implementazione personalizzata IPrincipal e/o IIdentity - a volte è un punto di estensione migliore e poiché non tutti ne sono a conoscenza, spesso non viene utilizzato.

1

Allo stesso modo si definisce l'appartenenza .net serie:

<membership defaultProvider="MyCustomMembershipProvider" userIsOnlineTimeWindow="30"> 
       <providers> 
        <clear /> 
        <add name="MyCustomMembershipProvider" type="Namespace.MyCustomMembershipProvider" connectionStringName="db_ConnectionString" enablePasswordRetrieval="true" enablePasswordReset="true" requiresQuestionAndAnswer="true" requiresUniqueEmail="false" passwordFormat="Encrypted" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="8" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/" /> 
        <add name="StandardMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="db_ConnectionString" enablePasswordRetrieval="true" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" passwordFormat="Encrypted" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="8" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/" /> 
       </providers> 
    </membership> 
Problemi correlati