0

我有一個帶有自定義成員資格和角色提供程序的MVC應用程序。我檢查用戶是否是這樣一個角色:存儲庫不會從HttpContext.Current.User.IsInRole注入

public static bool CustomersVisible 
{ 
    get 
    { 
     return 
      HttpContext.Current.User != null && 
      HttpContext.Current.User.Identity.IsAuthenticated && 
      HttpContext.Current.User.IsInRole("Admin"); 
    } 
} 

自定義角色提供程序是這樣的:

public class DRRoleProvider : RoleProvider 
{ 
    private IUserProfileRepository _userProfileRepository; 
    private IRoleRepository _roleRepository; 

    public DRRoleProvider() {} 

    public DRRoleProvider(IUserProfileRepository userProfileRepository, IRoleRepository roleRepository) 
    { 
     _userProfileRepository = userProfileRepository; 
     _roleRepository = roleRepository; 
    } 

. . . 

public override bool IsUserInRole(string username, string roleName) 
{ 
    var user = _userProfileRepository.GetByUserName(username); 
    var role = _roleRepository.GetByName(roleName); 

    if (user != null) 
    { 
     return user.Roles != null && user.Roles.Contains(role); 
    } 

    return false; 
} 

編輯補充:這是我的NinjectControllerFactory:

public class NinjectControllerFactory : DefaultControllerFactory 
{ 
    private IKernel ninjectKernel; 

    public NinjectControllerFactory() 
    { 
     ninjectKernel = new StandardKernel(); 
     AddBindings(); 
    } 

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     return controllerType == null 
        ? null 
        : (IController) ninjectKernel.Get(controllerType); 
    } 

    private void AddBindings() 
    { 
     ninjectKernel.Bind<ICustomerRepository>().To<CustomerRepository>(); 
     ninjectKernel.Bind<IUserProfileRepository>().To<UserProfileRepository>(); 
     ninjectKernel.Bind<IRoleRepository>().To<RoleRepository>(); 
     ninjectKernel.Bind<ISessionFactory>().ToProvider<SessionFactoryBuilder>().InSingletonScope(); 
     ninjectKernel.Bind<ISession>().ToMethod(CreateSession).InSingletonScope(); 

     ninjectKernel.Inject(Membership.Provider); 
     ninjectKernel.Inject(Roles.Provider); 
    } 

    private ISession CreateSession(IContext context) 
    { 
     var session = context.Kernel.Get<ISessionFactory>().OpenSession(); 
     return session; 
    } 
} 

當調用IsUserInRole方法時,我在_userProfileRepository上得到一個空引用異常。我怎樣才能確保從HttpContext.Current.User.IsInRole調用存儲庫注入?從我自己的代碼調用時它工作正常。

回答

1

RoleProvider並不真正依賴注入。它要求你有默認的構造函數。嘗試使用屬性注入。

由於您使用Ninject,也許這些問題/回答可以幫助:
Ninject with MembershipProvider | RoleProvider
Custom Role Provider using DI ninject throwing error

+0

我仍然使用屬性注入得到了同樣的問題。我認爲它可能與請求生命週期有關 - 當我創建一個新的客戶和用戶時,它保存了一切正常,但是當應用程序在創建後重定向到主頁並且嘗試檢查角色時,那是什麼時候存儲庫爲空。 – JeffCren

+0

問題很可能在您的Ninject配置中。你能用它更新你的問題嗎?你在哪裏告訴Ninject注入角色提供者屬性?在應用程序啓動? –

+0

我添加了我的NinjectControllerFactory中的代碼,但我也注意到,使用屬性注入時,存儲庫始終爲空,而不僅僅是在發佈和重定向之後。 – JeffCren

相關問題