如何使用Ninject将依赖项注入WCF中的自定义UserNamePasswordValidator?

时间:2015-05-10 12:58:01

标签: c# wcf ninject

我在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
    }
}

2 个答案:

答案 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,如果你仔细阅读这篇文章,你会发现你可能不需要它。您将了解如何通过配置文件中的一些简单更改注入验证器。