ロールの作成にASP.NET Identity 2を使用しましたが、HttpContext.GetOwinContext().GetUserManager<AppRoleManager>()
の結果はnullでした。
次に、ロールを作成できませんでした。
この問題を解決するにはどうすればよいですか?
public class MVCController : Controller
{
public MVCController()
{
}
public AppRoleManager RoleManager // returns null ?!
{
get
{
return HttpContext.GetOwinContext().GetUserManager<AppRoleManager>();
}
}
public User CurrentUser
{
get
{
string currentUserId = User.Identity.GetUserId();
User currentUser = DataContextFactory.GetDataContext().Users.FirstOrDefault(x => x.Id.ToString() == currentUserId);
return currentUser;
}
}
public IAuthenticationManager AuthManager
{
get
{
return HttpContext.GetOwinContext().Authentication;
}
}
public AppUserManager UserManager
{
get
{
return HttpContext.GetOwinContext().GetUserManager<AppUserManager>();
}
}
}
My Controller:
public class RoleAdminController : MVCController
{
[HttpPost]
public async Task<ActionResult> CreateRole([Required]string name)
{
if (ModelState.IsValid)
{
if (RoleManager != null) // RoleManager is null, why?!
{
IdentityResult result = await RoleManager.CreateAsync(new Role { Name = name });
if (result.Succeeded)
{
return RedirectToAction("Index");
}
else
{
AddErrorsFromResult(result);
}
}
}
return View(name);
}
}
AppRoleManager:
public class AppRoleManager : RoleManager<Role, int>, IDisposable
{
public AppRoleManager(RoleStore<Role, int, UserRole> store)
: base(store)
{
}
public static AppRoleManager Create(IdentityFactoryOptions<AppRoleManager> options, IOwinContext context)
{
return new AppRoleManager(new RoleStore<Role, int, UserRole>(DataContextFactory.GetDataContext()));
}
}
おそらく、OwinContextにApplicationUserManagerを作成する方法を提供していない可能性があります。
そのためには、これらをpublic void Configuration(IAppBuilder app)
に含める必要があります
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<AppRoleManager>(AppRoleManager.Create);
これにより、UserManager
とRoleManager
を作成するデリゲートがOwinContext
に登録されます。その後、コントローラーでこれらを呼び出すことができます。
私はそれが古い投稿であることを知っていますが、私の研究を他の人と共有したいので、この問題のために部分クラスを作成し、そこにすべてのowin参照を追加します。
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
// Configure the db context, user manager and signin manager to use a single instance per request
app.CreatePerOwinContext(IdentityModels.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
app.CreatePerOwinContext<AppRoleManager>(AppRoleManager.Create);
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
}
}
それから私は他の部分的なスタートアップでこの方法を利用します:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
}
}