我有一个WebApi服务,我正在尝试向使用Ninject BindHttpFilter添加身份验证。
使用BindHttpFilter可以将身份验证过滤器绑定到特定属性。 AuthenticationFilter采用构造函数参数(IAuthenticationService),该参数本身由Ninject创建。
kernel.BindHttpFilter<AuthenticationHttpFilter>(System.Web.Http.Filters.FilterScope.Action)
.WhenActionMethodHas<AuthenticationFilterAttribute>()
.WithConstructorArgument("service", x => x.Kernel.Get<IAuthenticationService>());
AuthenticationService的具体实现采用通过Ninject注入的构造函数参数INonceRepository:
public AuthenticationService(INonceRepository nonceRepository, ...)
NonceRepository的具体实现采用通过Ninject注入的构造函数ISession:
public NonceRepository(ISession session)
这是Ninject绑定的样子:
kernel.Bind<INonceRepository>().To<NonceRepository>();
kernel.Bind<IAuthenticationService>().To<AuthenticationService>()
var session = sessionFactory.OpenSession();
Bind<ISession>().ToMethod(c => session).InRequestScope();
当代码运行时,AuthenticationService的具体实现仅被实例化一次,因此NonceRepositiory仅被实例化一次。这意味着ISession有效并且打开了第一个请求,但是在第二次调用时关闭了ISession,并且从未第二次调用AuthenticationService的构造函数。似乎这是一个范围问题,但是我无法弄清楚没有正确的范围来使AuthenticationService根据请求重新创建。
我试图将BindHttpScope请求从FilterScope.Controller更改为FilterScope.Action(这种想法会导致AuthenticationService的范围是它是每个Action调用创建的,但并没有解决。)>
这是代码有趣的地方:
public class AuthenticationHttpFilter : IAuthenticationFilter
{
private readonly IAuthenticationService authenticationService;
public AuthenticationHttpFilter(IAuthenticationService service)
{
this.authenticationService = service;
}
public bool AllowMultiple { get; private set; }
public Task AuthenticateAsync(HttpAuthenticationContext authenticationContext, CancellationToken cancellationToken)
{
authenticationService.DoAuth();
return Task.FromResult(0);
}
public Task ChallengeAsync(HttpAuthenticationChallengeContext authenticationChallengeContext, CancellationToken cancellationToken)
{
...
}
}
public class AuthenticationService : IAuthenticationService
{
private readonly INonceRepository nonceRepo;
public AuthenticationService(INonceRepository nonceRepo){...}
public void DoAuth()
{
this.nonceRepo.Add(...);
}
}
public class NonceRepository : INonceRepository
{
private readonly ISession _session;
public NonceRepository(ISession session)
{
this._session = session;
}
public void Add(Nonce nonce)
{
this._session.Save(nonce);
}
}
我有一个WebApi服务,我正在尝试向使用Ninject BindHttpFilter添加身份验证。使用BindHttpFilter可以将身份验证过滤器绑定到特定属性。 ...