2016-04-22 7 views
0

Я не могу найти правильное решение для вышеуказанной проблемы. Я получаю System.NullReferenceException: Object reference not set to an instance of an object.ASP.NET MVC Custom RoleProvider не может извлекать роли из базы данных для имени пользователя

я после этого руководства http://techbrij.com/custom-roleprovider-authorization-asp-net-mvc

сообщение об ошибке от моего пользовательского RoleProvider из GetRolesForUser (строка имя пользователя) в строке var user = _VisitorService.GetVisitors().FirstOrDefault(u => u.Username == username);

VisitorService работает в контроллере, но не в RoleProvider ,

Ниже приведен код, пожалуйста, при необходимости. Спасибо вам заранее.

Пользовательские RoleProvider

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using TamilLeague.Service; 

namespace TamilLeague.WebUI 
{ 
    public class myRoleProvider : System.Web.Security.RoleProvider 
    { 
     private readonly IVisitorService _VisitorService; 
     public myRoleProvider(IVisitorService visitorservice) 
     { 
      _VisitorService = visitorservice; 
     } 
     public myRoleProvider() { } 

     public override string[] GetRolesForUser(string username) 
     {    
      var user = _VisitorService.GetVisitors().FirstOrDefault(u => u.Username == username); 
      if (user == null) 
       return null; 
      else 
      { 
       string role = user.Role.Title; 
       string[] rol = { role }; 
       return rol; 
      } 
     } 
} 

Мой контроллер

[AllowAnonymous] 
     [HttpPost] 
     public ActionResult Login(UserLoginVM thisUser, string returnUrl) 
     { 
      var visitor = _VisitorService.GetVisitors().FirstOrDefault(v => v.Username.ToLower() == thisUser.Username.ToLower()); 

      if (visitor == null) 
      { 
       ModelState.AddModelError("Username", "Username not found in system. Please register or change the username."); 
      } 
      if(!visitor.checkPassword(thisUser.HashedPassword)) 
      { 
       ModelState.AddModelError("Username", "Username or password is incorrect."); 
      } 

      if (visitor.IsFreezed == true) 
      { 
       ModelState.AddModelError("Username", "Account is freezed. Contact the administrator please."); 
      } 

      if (visitor.IsConfirmed == false) 
      { 
       ModelState.AddModelError("Username", "Account is not activated. Contact the administrator please or log into your email to activate your account."); 
      } 

      if (ModelState.IsValid) 
      { 
       FormsAuthentication.SetAuthCookie(thisUser.Username, true); 
       if (!string.IsNullOrWhiteSpace(returnUrl)) 
       { 
        return Redirect(returnUrl); 
       } 
       else 
       { 
        return RedirectToAction("GiveAccess", new { id = visitor.ID }); 
       } 
      } 
      return Content("Testing"); 
     } 

метод GiveAccess

public ActionResult GiveAccess(int ID) 
     { 
      var user = _VisitorService.GetVisitor(ID); 
      String[] roles = Roles.Provider.GetRolesForUser(user.Username); 

      if(roles.Contains("Administrator")) 
      { 
       return RedirectToAction("SysUser", "Admin"); 
      } 
      else 
      { 
       return RedirectToAction("Index", "Member"); 
      } 
      //RedirectToAction("Index", "Member"); 
     } 

Web.config

<system.web> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/User/Login"/> 
    </authentication> 
    <roleManager enabled="true" defaultProvider="TamilLeagueRoleProvider"> 
     <providers> 
     <clear/> 
     <add name="TamilLeagueRoleProvider" type="TamilLeague.WebUI.myRoleProvider" cacheRolesInCookie="false"/> 
     </providers> 
    </roleManager> 
    <compilation debug="true" targetFramework="4.5"/> 
    <httpRuntime targetFramework="4.5"/> 
    </system.web> 

ответ

0

У вас есть конструктор без параметров в myRoleProvider, который не создает экземпляр службы. Вы уверены, что класс не входит в этот конструктор? Если это так, то при попытке использовать эту услугу вы получите исключение с нулевой ссылкой.

+0

Вот что я думал .. но когда я удалить конструктор без параметров я получаю сообщение об ошибке «Нет без параметров конструктора, определенные для этого объекта.» . :( –

+0

См Wins ответ ниже Вам нужно создать экземпляр службы в конструктор без параметров –

0

Вы не можете устанавливать зависимости от RoleProvider через конструктор. Другими словами, Провайдер модели теперь не разрешает параметризованный конструктор.

Чтобы решить эту проблему, вы хотите использовать Service Locator Pattern.

Например, в Autofac -

private IVisitorService VisitorService { get; set; } 

public MyRoleProvider() 
{ 
    var cpa = (IContainerProviderAccessor)HttpContext.Current.ApplicationInstance; 
    var cp = cpa.ContainerProvider; 

    VisitorService = cp.RequestLifetime.Resolve<IVisitorService>(); 
} 
+0

привет я реализован autofac Теперь я получаю IContainerProviderAccessor не может быть найден «частный IVisitorService VisitorService. {Получить, установить;} общественного myRoleProvider (IVisitorService visitorservice) { _VisitorService = visitorservice; } общественного myRoleProvider() { вара СР = (IContainerProviderAccessor) HttpContext.Current.ApplicationInstance; } –

+0

могли бы вы попробовать 'вар visitorService = DependencyResolver.Current.GetService () ;?? – Win

+0

, когда я вхожу в пространство имен Autofac.Integration. Web; он говорит, что Web не существует в пространстве имен Autofac.Integration –