我在WCF中使用带有Ninject的UserNamePasswordValidator进行依赖注入,但是Ninject无法将我的容器注入到类中。
class MyUserNamePassValidator : System.IdentityModel.Selectors.UserNamePasswordValidator
{
private MyService _myService;
public MyUserNamePassValidator(MyService myService)
{
this._myService = myService;
}
public override void Validate(string userName, string password)
{
this._myService.Login(userName, password); // this._myService is null
}
}
答案 0 :(得分:1)
不幸的是,WCF不会允许您欺骗验证器创建过程,例如通过传递工厂而不是像ServiceHost那样的类型。
以下是WCF源代码(UserNameServiceElement
类)的一部分,它清楚地说明了这一点:
Type type = Type.GetType(this.CustomUserNamePasswordValidatorType, true);
if (!typeof (UserNamePasswordValidator).IsAssignableFrom(type))
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError((Exception) new ConfigurationErrorsException(System.ServiceModel.SR.GetString("ConfigInvalidUserNamePasswordValidatorType", (object) this.CustomUserNamePasswordValidatorType, (object) typeof (UserNamePasswordValidator).ToString())));
userName.CustomUserNamePasswordValidator = (UserNamePasswordValidator) Activator.CreateInstance(type);
我可以看到2种解决方法:
答案 1 :(得分:-1)
简而言之,您不需要Ninject或任何其他类似的东西,因为.NET Framework具有内置功能。</ p>
请阅读
Authentication and Authorization with ASP.NET Identity 2.0 for WCF Services
请注意节点,虽然文章谈到了Identity 2.0,如果你仔细阅读这篇文章,你会发现你可能不需要它。您将了解如何通过配置文件中的一些简单更改注入验证器。