2015-03-13 72 views
2

我试图通过注入一个Ninject UserFactory,这里是我的绑定:Ninject总是注入空HttpContext.Current()

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始终为null。这是一个MVC4项目,如果这对方法有什么不同。

更新: 我也曾尝试下面的代码不错误,但我注入CurrentUserProvider财产保持为空:

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

嗯,首先,你真的不应该再解密AUTH的cookie像这样,你也不应该使用会话来存储用户ID信息。您应该改为使用自定义的IPrincipal,例如此处定义的:http://peterbromberg.net/post/Implementing-a-Custom-IPrincipal-in-an-ASPNET-MVC-Application.aspx – 2015-03-14 01:53:40

+0

感谢您的提醒,我会研究一下。在这种情况下,我不使用会员资格,而是使用定制身份验证cookie的定制身份验证。该cookie仅存储非敏感数据。 – Simon 2015-03-14 20:37:57

+0

会员与任何事情有什么关系? IPrincipal是与FormsAuthentication相关的,而不是与会员相关的。这个例子使用成员资格,但你可以使用任何你想要的。 – 2015-03-15 03:18:06

回答

1

感谢NightOwl888与this answer指着我在正确的方向。

,而不是试图用HttpContext的直接与Ninject工作,而不是我投放了工厂对象沿着这些线路:

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); } 
    } 
} 
0

它看起来像你对我都太早创建CurrentUserProvider对象。如果你想让它在结合时创建的,我相信你可以更新您的代码是这样的:

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

谢谢,但我的注入属性始终为空。 – Simon 2015-03-13 21:09:51