1

我有一个 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 中,因为我不能使用构造函数模式。我不知道这是否是问题所在。

请帮忙!我有点迷失在这里!

4

1 回答 1

0

您如何将您的 CustomAuthorizeAttribute 绑定到操作?它是全局过滤器还是基于每个操作?是您的服务/等。将状态存储在内存中?

不幸的是,这里没有很多信息可以帮助调试问题。也许您可以发布有关如何完成密码更改以及发回 202 响应等的更多信息?

于 2012-08-14T10:22:24.957 回答