我目前正在为asp .net写一个自定义成员资格提供程序,而我遇到的问题是我不知道如何以与提供给标准asp相同的方式向自定义成员资格提供程序提供参数。 web.config文件中的网络成员资格提供程序,如密码长度。
答案 0 :(得分:5)
当您从MembershipProvider
派生自己的类时,必须覆盖Initialize()
方法,它具有以下签名:
public override void Initialize(string name, NameValueCollection config);
System.Collections.NameValueCollection
是一个字典,您可以在其中找到web.config
文件中的选项。这些选项的指定方式与指定"标准"的选项相同。提供者(作为属性)。每个字典条目都具有属性名称的键,并且具有属性值(作为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;
}
}
答案 1 :(得分:2)
如果您的提供者派生自MembershipProvider : ProviderBase
,那么应该从web.config加载并应用所有配置。
考虑实施自定义IPrincipal
和/或IIdentity
- 它有时是一个更好的扩展点,因为不是每个人都知道它通常不会被使用。
答案 2 :(得分: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>