gpt4 book ai didi

asp.net - 布局 View 中的 Roles.GetRolesForUser() 不返回角色

转载 作者:行者123 更新时间:2023-12-01 08:14:39 25 4
gpt4 key购买 nike

razor 布局 View 中的

@Roles.GetRolesForUser() 未返回角色。 @Roles.GetRolesForUser().Count() 为 0。

虽然 @Roles.IsUserInRole('name_of_logged_in_role') 在同一位置的同一 View 中返回 true

Razor View :

<p>
@User.Identity.Name //Output: MyName
@Roles.GetRolesForUser().Count() //Output: 0
@Roles.IsUserInRole("Radiologist") //Output: True
</p>

更新

@Roles.GetRolesForUser(User.Identity.Name).Length //Output: 0
@Roles.GetRolesForUser(User.Identity.GetUserName()).Length //Output: 0

最佳答案

经过广泛的研究,我终于找到了问题所在。我能够在 Web 应用程序中重现该问题。显然,您不能将 ASP.NET IdentitySimple Membership 结合使用,就像您使用 GetRolesForUser 方法那样。 Roles 对象默认设置为使用默认提供程序的 Simple Membership,但看起来您使用的是 ASP.NET Identity 而不是 简单的成员(member)资格。我什至没有注意到差异,直到我想知道为什么它不起作用。

你得到 string[0] 的原因是因为 GetRolesForUser 对数据库中不存在的表执行了 sql 查询。
IsUserInRole 工作的原因或多或少是因为它甚至没有使用默认提供程序来检查它是否使用了 CacheRolesInCookie

If CacheRolesInCookie is true, then roleName may be checked against the roles cache rather than the specified role provider.

因此,从技术上讲,它转到默认提供程序列出的 connectionString 并返回 string[0],因为数据库中没有包含该 connectionString 的数据。将您当前的数据库添加到提供程序也无济于事,因为 Simple Membership 数据库架构不同于 ASP.NET Identity

话虽如此,您应该像这样通过用户名获取角色:

简单的解决方案:

public List<string> GetRoles(string UserName)
{ List<string> roles = new List<string>();
if (!string.IsNullOrWhiteSpace(UserName))
{
ApplicationUser user = context.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
var account = new AccountController();

roles = account.UserManager.GetRoles(user.Id);
}
return roles;
}

已更新

扩展解决方案:

您可以在您的上下文中扩展 ASP.NET Identity 角色

http://www.codeproject.com/Articles/799571/ASP-NET-MVC-Extending-ASP-NET-Identity-Roles

关于asp.net - 布局 View 中的 Roles.GetRolesForUser() 不返回角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30535820/

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