6

我目前正在为 asp .net 编写自定义成员资格提供程序,我遇到的问题是我不知道如何以与标准 asp.net 成员资格提供程序相同的方式为自定义成员资格提供程序提供参数在 web.config 文件中,例如密码长度。

4

3 回答 3

5

当您派生自己的类时,MembershipProvider您必须重写该Initialize()方法,它具有以下签名:

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

System.Collections.NameValueCollection是一个字典,您可以在其中找到写入web.config文件中的选项。这些选项的给出方式与您为“标准”提供程序(作为属性)指定选项的方式相同。每个字典条目都有属性名称的键和属性的值作为值(as string)。

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

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

在我的示例中,在GetBoolean()某处声明的扩展方法如下:

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;
    }
}
于 2012-12-21T09:13:53.870 回答
2

如果您的提供程序源自MembershipProvider : ProviderBase所有配置,则应从 web.config 加载和应用所有配置。

考虑实现自定义IPrincipal和/或IIdentity- 它有时是一个更好的扩展点,因为不是每个人都知道它通常不被使用。

于 2012-12-21T09:07:53.260 回答
1

以同样的方式定义标准 .net 成员资格:

<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>
于 2012-12-21T09:15:11.943 回答