【问题标题】:Ninject always injects null HttpContext.Current() [duplicate]Ninject 总是注入 null HttpContext.Current() [重复]
【发布时间】:2015-03-16 16:43:07
【问题描述】:

我正在尝试通过 Ninject 注入 UserFactory,这是我的绑定:

  var u = new CurrentUserProvider(HttpContext.Current);
            kernel.Bind<ICurrentUserProvider>().ToMethod(context => u).InRequestScope();

这个工厂使用HttpContext读取一个认证cookie并填充一个CurrentUser对象,HttpContext作为构造函数参数传递:

 public class CurrentUserProvider : ICurrentUserProvider
{
    public ICurrentUser CurrentUser { get; set; }

    public CurrentUserProvider(HttpContext context)
    {
        CurrentUser = GetCurrentUser(context);
    }

    private static ICurrentUser GetCurrentUser(HttpContext ctx)
    {
        var httpCookie = ctx.Request.Cookies[".ASPXAUTH"];

        if (httpCookie != null)
        {
            var cookie = httpCookie.Value;
            var ticket = FormsAuthentication.Decrypt(cookie);

            if (ticket != null)
            {
                var x = ticket.UserData.FromJson<CurrentUser>();
                ctx.Session["UserID"] = x.DatabaseName;
                return x;
            }
        }
        return null;
    }
}

但是,传入 UserFactory 构造函数的 HttpContext 始终为空。如果这对方法有任何影响,那么这是一个 MVC4 项目。

更新: 我还尝试了以下代码,但我注入的CurrentUserProvider 属性仍然为空:

 kernel.Bind<ICurrentUserProvider>().To<CurrentUserProvider>().InRequestScope()
            .WithConstructorArgument("context", ninjectContext => HttpContext.Current);

【问题讨论】:

  • 嗯,首先,你真的不应该像那样重新解密 auth cookie,也不应该使用 session 来存储 UserID 信息。您应该改用自定义 IPrincipal,例如在此处定义:peterbromberg.net/post/…
  • 感谢您的提醒,我会调查的。在这种情况下,我没有使用会员资格,而是使用写入自定义身份验证 cookie 的定制身份验证。 cookie 仅存储非敏感数据。
  • 会员资格与什么有什么关系? IPrincipal 是 FormsAuthentication 相关的,而不是 Membership 相关的。该示例使用会员资格,但您可以使用任何您想要的东西。
  • 感谢@NightOwl888,您的回答让我重新思考了我的方法,现在我已经完成了所有工作

标签: c# asp.net-mvc asp.net-mvc-4 ninject


【解决方案1】:

感谢 NightOwl888 用this answer 为我指明了正确的方向。

我没有尝试通过 Ninject 直接使用 HttpContext,而是按照以下方式注入了一个工厂对象:

  public class AspNetUserContext : IUserContext
{
    public User CurrentUser
    {
        // Do not inject HttpContext in the ctor, but use it
        // here in this property
        get { return new User(HttpContext.Current.User); }
    }
}

【讨论】:

    【解决方案2】:

    在我看来,您创建 CurrentUserProvider 对象的时间过早。如果您希望在绑定时创建它,我相信您可以将代码更新为如下所示:

        kernel.Bind<ICurrentUserProvider>().ToMethod(context => new CurrentUserProvider(context)).InRequestScope();
    

    【讨论】:

    • 谢谢,但我注入的属性始终为空。
    猜你喜欢
    • 2011-02-17
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多