需要帮助 [Authorize(Roles="Admin")] 和 User.isInRole("Admin") 在 Asp.Net 身份 1 中工作

Need help getting [Authorize(Roles="Admin")] and User.isInRole("Admin") working in Asp.Net identity 1

我只是不明白这两个可能非常有用的功能应该如何工作。

[Authorize(Roles="Admin")] //Method A

User.isInRole("Admin") //Method B

他们现在显然对我不起作用。我做了几个小时的研究:

我读到您需要实施 System.Web.Security.RoleProvider,然后在网络配置中进行设置:

 <roleManager defaultProvider="OdbcRoleProvider" 
  enabled="true"
  cacheRolesInCookie="true"
  cookieName=".ASPROLES"
  cookieTimeout="30"
  cookiePath="/"
  cookieRequireSSL="false"
  cookieSlidingExpiration="true"
  cookieProtection="All" >
  <providers>
    <clear />
    <add
      name="OdbcRoleProvider"
      type="Samples.AspNet.Roles.OdbcRoleProvider"
      connectionStringName="OdbcServices" 
      applicationName="SampleApplication" 
      writeExceptionsToEventLog="false" />
  </providers>
</roleManager>

这导致我通过构造实现的 RoleProvider,但角色检查函数肯定没有调用其中的任何方法。

然后我读到 Asp.NET Identity 取消了 RoleProvider,现在你需要这样做:

 <modules runAllManagedModulesForAllRequests="true">
  <remove name="FormsAuthenticationModule" />
  <remove name="RoleManager" />
</modules>

我做到了。

我有一个连接到我的 postgres 后端的自定义 UserManager。问题是每当我使用它时,我都需要实例化一个。在我看来,如果函数 A 和 B 能够正常工作,那么我实现的 UserManager 需要在某种配置文件中被引用,所以 Asp.NET 隐含地知道它。 这就像过去的角色管理器一样。

ASP.NET identity 如何改变函数 A 和 B 如何使用行为从旧的 RoleProvider 检查角色?

我想通了。

当您这样调用登录代码时:

var user = await UserManager.FindAsync(model.Email, model.Password);
            if (user != null && user.PasswordRequiresReset == false)
            {
                await SignInAsync(user, model.RememberMe); //triggers IUserRoleStore.GetRolesAsync
                return RedirectToLocal(returnUrl);
            }

SignInAsync 从 IUserRoleStore 触发 GetRolesAsync:

public Task<IList<string>> GetRolesAsync(TUser user) //where TUser is an ApplicationUser
    {

        Func<object, IList<string>> getRoles = (object user2) =>
        {
            TUser user3 = (TUser)user2;
            return user3.Roles.Select(x => x.Role.Name).ToList();
        };


        return Task.Factory.StartNew(getRoles, user);

    }

在上面,当我在 FindAsync 中创建它时,我选择简单地从我已经从数据库加载并存储在 ApplicationUser 对象中的角色生成角色。

来自 GetRolesAsync 的角色必须加载到 cookie 中的某个位置,以便函数 A 和 B 可以快速轻松地访问它们。