2015-01-03 17 views
8

Tôi đang cố triển khai vai trò người dùng vào ứng dụng web MVC của mình. Tuy nhiên tôi nhận được một ngoại lệ null trên dòng return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); trong bộ điều khiển tài khoản của tôi.Điều khiển tài khoản MVC5 ngoại lệ tham chiếu null

điều khiển tài khoản

[Authorize] 
public class AccountController : Controller 
{ 
    private ApplicationSignInManager _signInManager; 
    private ApplicationUserManager _userManager; 
    private ApplicationRoleManager _roleManager; 

    public AccountController(){} 

    public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager, ApplicationRoleManager roleManager) 
    { UserManager = userManager; 
     SignInManager = signInManager; 
     RoleManager = roleManager; } 
    public ApplicationRoleManager RoleManager 
    { 
     get { return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>(); } 
     private set { _roleManager = value; } 
    } 

    public ApplicationSignInManager SignInManager 
    { 
     get { return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>(); } 
     private set { _signInManager = value; } 
    } 

    public ApplicationUserManager UserManager 
    { 
     get { return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); } 
     private set {_userManager = value; } 
    } 

ActionResult rằng sẽ kích hoạt thêm của người sử dụng với vai diễn.

[System.Web.Mvc.HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult RoleAddToUser(string UserName, string RoleName) 
    { 
     ApplicationUser user = context.Users.FirstOrDefault(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)); 
     var account = new AccountController(); 
     if (user != null) account.UserManager.AddToRole(user.Id, RoleName); 
     var list = context.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList(); 
     ViewBag.Roles = list; 
     return View("ManageUserRoles"); 
    } 

Startup.Auth có chứa

 app.CreatePerOwinContext(ApplicationDbContext.Create); 
     app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create); 
     app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 
     app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); 

nhận dạng Config

// Configure the application sign-in manager which is used in this application. 
public class ApplicationSignInManager : SignInManager<ApplicationUser, string> 
{ 
    public ApplicationSignInManager(ApplicationUserManager userManager, IAuthenticationManager authenticationManager) 
     : base(userManager, authenticationManager) 
    { 
    } 

    public override Task<ClaimsIdentity> CreateUserIdentityAsync(ApplicationUser user) 
    { return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager); } 

    public static ApplicationSignInManager Create(IdentityFactoryOptions<ApplicationSignInManager> options, IOwinContext context) 
    { return new ApplicationSignInManager(context.GetUserManager<ApplicationUserManager>(), context.Authentication); } 
} 
public class ApplicationRoleManager : RoleManager<IdentityRole> 
{ 
    public ApplicationRoleManager(IRoleStore<IdentityRole, string> roleStore) 
     : base(roleStore) { } 

    public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context) 
    { 
     return new ApplicationRoleManager(new RoleStore<IdentityRole>(context.Get<ApplicationDbContext>())); 
    } 
} 

đâu là tham chiếu null đến từ đâu? Trong mã tôi kiểm tra lại rằng người dùng tồn tại.

Cảm ơn

Trả lời

19

Đây là chắc chắn các dòng vi phạm ...

var account = new AccountController(); 
if (user != null) account.UserManager.AddToRole(user.Id, RoleName); 

Bộ xử lý không có nghĩa là để được thuyết minh trong cách này bởi vì họ đang nặng nề gắn liền với yêu cầu HTTP hiện tại (do đó HttpContext).

Khi HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); bị trúng, HttpContext là không vì không có ngữ cảnh.

Bạn chỉ cần đặt cùng một thuộc tính vào bộ điều khiển nơi bạn đang cố gắng truy cập UserManager. Điều này làm việc vì OwinContext được chia sẻ trên toàn bộ ứng dụng của bạn.

public class HomeController : Controller 
{ 
    public ApplicationUserManager UserManager 
    { 
     get { return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); } 
     private set {_userManager = value; } 
    } 

    public ActionResult RoleAddToUser(string UserName, string RoleName) 
    { 
     ApplicationUser user = context.Users.FirstOrDefault(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)); 
     if (user != null) UserManager.AddToRole(user.Id, RoleName); 

     //Other code... 

     return View("ManageUserRoles"); 
    } 
} 

Và nếu bạn muốn nhận được sự ưa thích, khai báo một BaseController được thừa kế từ Controller, đặt UserManager tài sản bên trong, và có tất cả các bộ điều khiển khác kế thừa từ cơ sở của bạn.

+0

Thiên Chúa cũng rất đơn giản. Cảm ơn nhiều! – electrometro

+0

Điều này cũng giúp tôi. Đã đi các tuyến đường ưa thích và tạo ra một bộ điều khiển cơ sở để vượt qua các chức năng phổ quát vào những nơi khác mà tôi cần. Tư duy rực rỡ! – Dreamcasting

+0

Cảm ơn rất nhiều Giày –

Các vấn đề liên quan