gpt4 book ai didi

c# - User.IsInRole() 在角色分配后不工作,但在重新登录后工作

转载 作者:可可西里 更新时间:2023-11-01 08:47:17 30 4
gpt4 key购买 nike

在 ASP.NET MVC 5 应用程序中,我使用 Unity 容器创建 OWIN/Identity 对象并解析所有依赖项。

问题是当我注册为新用户并给他分配这样的角色时

userManager.AddToRole(user.Id, "NewUser");
...
await userManager.UpdateAsync(user);

它实际上在 AspNetUserRoles 表中创建了一条记录,但在那之后如果我用 User.IsInRole("NewUser") 检查他的角色我得到的是假的,除非我注销然后重新登录,否则它是真的。

我猜问题可能出在 Unity 上下文中的身份对象(UserManager、RoleManager 等)生命周期管理上。

UnityConfig.cs

public static void RegisterTypes(IUnityContainer container)
{
// DbContext
container.RegisterType<DbContext, AppEntitiesDbContext>();
container.RegisterType<AppIdentityDbContext>();

// Identity
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(
new InjectionConstructor(typeof(AppIdentityDbContext)));

container.RegisterType<IAuthenticationManager>(
new InjectionFactory(c => HttpContext.Current.GetOwinContext().Authentication));

container.RegisterType<IRoleStore<IdentityRole, string>, RoleStore<IdentityRole>>(
new InjectionConstructor(typeof(AppIdentityDbContext)));

container.RegisterType<ApplicationUserManager>();
container.RegisterType<ApplicationSignInManager>();
container.RegisterType<ApplicationRoleManager>();
}

IdentityConfig.cs(我在 Web.config 中使用 <add key="owin:AppStartup" value="MyApp.IdentityConfig" />)

public class IdentityConfig
{
public void Configuration(IAppBuilder app)
{
var container = UnityConfig.GetConfiguredContainer();

app.CreatePerOwinContext(() => container.Resolve<AppIdentityDbContext>());
app.CreatePerOwinContext(() => container.Resolve<ApplicationUserManager>());
app.CreatePerOwinContext(() => container.Resolve<ApplicationSignInManager>());
app.CreatePerOwinContext(() => container.Resolve<ApplicationRoleManager>());

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login")
});
}
}

最佳答案

这是因为使用 User 对象 (IPrincipal) 中的任何内容都是在查看当前 HTTP 请求的用户身份 token ,而不是用户的持久值。

当您登录时,该 token 将从角色和其他声明中创建。如果您更改用户在数据库中的角色,则需要重新创建 token 并将其设置为用户的新身份。

当您更改用户身份的一部分时。只需使旧 token 失效,然后通过注销/重新登录来重新颁发新 token 即可。

private async Task SignInAsync(User user, bool isPersistent)
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
}

关于c# - User.IsInRole() 在角色分配后不工作,但在重新登录后工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28497342/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com