我有一个 ASP.NET web api 项目和一个 MVC3 项目。对于这两个项目,Ninject 都被配置为依赖解析器。
我在 web api 项目中遇到问题,因为我正在编写自己的 Authorization 属性,以便授权对我的 API 的传入请求。在这个属性中,我需要注入一些依赖项来对请求进行一些验证。
所以这就是属性中的代码的样子:
public class CustomAuthorizeAttribute : ActionFilterAttribute
{
public string Roles { get; set; }
[Inject]
public IAuthSchemaSelector _schemaSelector { private get; set; }
[Inject]
public IUserService _userService { private get; set; }
[Inject]
public IRoleVerifier _roleVerifier { private get; set; }
public override void OnActionExecuting(HttpActionContext actionContext)
{
try
{
var principal = _schemaSelector.Authorize(actionContext.Request, Roles, _userService, _roleVerifier);
actionContext.Request.Properties["MS_UserPrincipal"] = principal;
}
catch (Exception ex)
{
//create error response with proper http status
}
}
}
}
_schemaSelector 决定客户端使用哪个授权模式来请求 API 中包含的服务(这是因为我计划支持不同的模式,如 OAuth、API 密钥授权等。现在我只使用 HttpBasic)。因此,如果一切顺利,我设置了主要用户,这样我就可以在 ApiController 中访问它。
一切都很完美,直到我从网站 de MVC3 项目进行修改。例如,网站中有一个功能可以更改用户密码。假设您有一个初始密码 123456。我使用 HttpBasic 从 api 发出请求,api 响应 http 状态 202。
现在我把网站上的密码改成1234567,使用旧密码(123456)从api执行另一个请求,它响应202,这是错误的。
_userService 对象的行为不正常(其他两个对象都没有注入),当我调试动作过滤器时,我注意到整个对象处于以前的状态。我猜想ninject的配置方式有问题。
这就是我配置ninject的方式:
在 NinjectWebCommon.cs 中:
GlobalConfiguration.Configuration
.ServiceResolver
.SetResolver(t => kernel.TryGet(t),
t => kernel.GetAll(t));
在ninject模块文件中:
kernel.Bind<IUserService>().To<UserService>(); //user service is part of the unit of work
kernel.Bind<IUnitOfWork>().To<EFUnitOfWork>().InRequestScope();
kernel.Bind<IRoleVerifier>().To<RoleVerifier>();
kernel.Bind<IAuthSchemaSelector>().To<AuthSchemaSelector>();
值得一提的是,我使用属性注入模式将 _userService 注入到 ActionFilterAttribute 中,因为我不能使用构造函数模式。我不知道这是否是问题所在。
请帮忙!我有点迷失在这里!