我实施了一个来自 ExtendedMembershipProvider 的 CustomMembershipProvider 。 IUserService 是 CustomMembershipProvider 的依赖关系,它将用于验证给定的凭据。 这将在Web.Config;
中配置 <membership defaultProvider="DefaultMembershipProvider">
<providers>
<add name="DefaultMembershipProvider" type="BorderExpress.AutoImport.Web.Security.CustomMembershipProvider" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
</providers>
</membership>
通过构造函数注入 IUserService 实现,因为 CustomMembershipProvider 需要无参数构造函数。
因此想到引入Property注入。我将IUserService作为CustomMembershipProvider的公共属性。
public class CustomMembershipProvider : ExtendedMembershipProvider
{
public IUserService UserService { get; set; }
public CustomMembershipProvider()
{
}
...
public override bool ValidateUser(string username, string password)
{
var user = UserService.GetUser(username);
if (user != null && SaltedHash.Verify(user.Salt, user.Hash, password))
{
return true;
}
return false;
}
}
我只为此注册编写了一个单独的安装程序
public class WindsorMembershipInstaller:IWindsorInstaller
{
public void Install(Castle.Windsor.IWindsorContainer container, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
{
container.Register(
Component.For<CustomMembershipProvider>()
);
}
}
在调用ValidateUser时,该功能无效, UserService 始终为NULL。
我尝试过贡献者;
public class RequireUserServiceProperties : IContributeComponentModelConstruction
{
public void ProcessModel(Castle.MicroKernel.IKernel kernel, Castle.Core.ComponentModel model)
{
model.Properties
.Where(p => p.Dependency.TargetItemType == typeof(IUserService))
.All(p => p.Dependency.IsOptional = false);
}
}
注册我引导容器的贡献者。
_container = new WindsorContainer()
.Install(FromAssembly.This());
_container.Kernel.ComponentModelBuilder.AddContributor(new RequireUserServiceProperties());
请告诉我如何注入 CustomMembershipProvider
的IUserService属性答案 0 :(得分:1)
我在SO中找到了答案。 @Mauricio Scheffer已经完成了自定义实现,以利用windsor将依赖关系注入成员资格提供者。
原始问题 How do I control MembershipProvider instance creation/lifetime?
@Mauricio Scheffer的博文
http://bugsquash.blogspot.com/2010/11/windsor-managed-membershipproviders.html