需要帮助 [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 可以快速轻松地访问它们。
我只是不明白这两个可能非常有用的功能应该如何工作。
[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 可以快速轻松地访问它们。