我正在为WCF服务构建自定义UserNamePasswordValidator.我正在使用Autofac + WCF/multitenant连接服务,所有这些都整齐地安装在一起.但是,我不确定使用什么策略来连接/实现此身份验证类.
理想情况下,我会开始
public class MyValidator : UserNamePasswordValidator {
public MyValidator(Func<Owned<IMyUserService>> userservicefactory) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这并不是严格可行的,因为WCF使用UserNamePasswordValidator的方式(唯一的选项似乎是无参数构造函数).
所以,问题:
我有一个托管在IIS中的服务.它由Web.config配置.
我创建了一个自定义的UserNamePassValidator,如果II在validate方法中有逻辑,它就可以工作.但我想在另一个项目中使用逻辑并使用DI注入如下.
public class UserNamePassValidator : System.IdentityModel.Selectors.UserNamePasswordValidator
{
private readonly ISystemAuthentication _systemAuthentication;
public UserNamePassValidator(ISystemAuthentication systemAuthentication)
{
_systemAuthentication = systemAuthentication;
}
public override void Validate(string userName, string password)
{
_systemAuthentication.Validate(userName, password))
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Autofac WCF集成.
var builder = new ContainerBuilder();
builder.RegisterType<AuthenticationService>().As<IAuthenticationService>();
builder.Register(c => new SystemAuthentication()).As<ISystemAuthentication>();
builder.Register(c => new UserNamePassValidator(c.Resolve<ISystemAuthentication>()));
AutofacHostFactory.Container = builder.Build();
Run Code Online (Sandbox Code Playgroud)
当我浏览到该服务时,我收到以下错误:
[MissingMethodException: No parameterless constructor defined for this object.]
Run Code Online (Sandbox Code Playgroud)
web.config行为;
<userNameAuthentication
userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="MyNamespace.UserNamePassValidator, service" />
Run Code Online (Sandbox Code Playgroud)
我已阅读以下相关帖子,但示例是自托管服务: 如何将对象注入WCF验证器类
编辑
<system.serviceModel>
<services>
<service behaviorConfiguration="Namespace.AuthenticationServiceBehaviour" name="Namespace.AuthenticationService" >
<endpoint address="" binding="wsHttpBinding" contract="Namespace.IAuthenticationService" bindingConfiguration="SafeServiceConf"> …Run Code Online (Sandbox Code Playgroud)