2015-01-03 13 views
8

MVC5 Hesap Kontrolörü. Ancak, hesap denetleyicimde return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); hattında boş bir istisna alıyorum.Benim MVC web uygulaması içine kullanıcı rollerini uygulamak çalışıyorum null başvuru özel

Hesap Kontrolörü rolüne kullanıcının ekleyerek tetikleyecek

[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.

[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

// 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>())); 
    } 
} 

nerede null başvuru geliyor

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

Kimlik Config'i içeriyor mu? Kodda, kullanıcının var olduğunu iki kez kontrol ediyorum.

Teşekkür

cevap

19

Bunlar şüphesiz kusurlu çizgilerdir ...

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

Kontrolörler onlar ağır akım HTTP isteği (böylece HttpContext bağlı çünkü bu şekilde örneğinin olması anlamına gelmez ). Bir bağlam çünkü HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); çarpıyor

, HttpContext boş.

Sadece sen UserManager ulaşmaya çalışıyorsunuz denetleyicinizdeki aynı özelliği koyabilirsiniz. Bu, OwinContext'in tüm uygulamanız genelinde paylaşıldığından çalışır.

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

Ve gerçekten fantezi almak istiyorsanız, Controller devraldığı bir BaseController beyan, içeride UserManager özelliğini koymak ve tüm diğer kontrolörler senin tabanından devralan var.

+0

Allah çok öylesine basitti. Çok teşekkürler! – electrometro

+0

Bu da beni aldı. Fantazi rotaya gittim ve evrensel fonksiyonları ihtiyaç duyduğum diğer yerlere iletmek için bir temel kontrol cihazı oluşturdu. Parlak düşünme! – Dreamcasting

+0

Çok teşekkürler Ayakkabı –

İlgili konular