如何在 _LoginPartial 的代码部分中获取用户角色?

Posted

技术标签:

【中文标题】如何在 _LoginPartial 的代码部分中获取用户角色?【英文标题】:How do I get User's Role within code portion of _LoginPartial? 【发布时间】:2017-02-25 16:10:33 【问题描述】:

我正在使用 MVC 实体框架,我需要在 _LoginPartial 中获取用户的角色,以便在导航栏中获得一些特定于角色的功能。到达那里的最佳方法是什么?

我尝试过使用Dim myRoles = Roles.GetRolesForUser(),但没有任何结果。这是错误的,因为我在其他地方使用了特定于角色的功能,而且效果很好。

在 Marco 评论中的链接之后,它提到了使用 ClaimsIdentity,但对我来说,它说 ClaimsIdentity 未声明(Rick 在去年 8 月在那里发表评论,解释说它对他不起作用,就像过去 2 年发生的变化一样)。

我也试过这个,这类似于我在其他地方工作的控制器中的代码:

Dim context As IOwinContext = New OwinContext
Dim manager = New AppUserManager(New UserStore(Of AppUser(context.Get(Of MyAppIdentityDbContext)()))
Dim userInfo = manager.FindById(curUserID)
Dim userRole As String = userInfo.Roles(0).RoleId
myRole = db.Roles.Where(Function(x) x.Id = userRole).FirstOrDefault().Name

但在运行时,我在“Dim manager”行中收到错误提示

“System.ArgumentNullException”类型的异常发生在 Microsoft.AspNet.Identity.EntityFramework.dll 但未在其中处理 用户代码附加信息:值不能为空。

我不知道它在说什么价值。

【问题讨论】:

asp.net identity get all roles of logged in user的可能重复 @Marco - 已编辑以根据您的评论添加更多详细信息 试试我评论文章中所说的。应该管用。如果需要,请使用 C#/vb 转换器。 @Marco,您是指他们问题中的提问者链接的教程吗?那篇文章指定使用“String[] roles = Roles.GetRolesForUser();”,我在上面编辑的问题中将其翻译为 VB。它什么都不返回。 不,我的意思是我第一条评论中问题的答案。 【参考方案1】:

感谢 Marco 的帮助和他链接的另一个问题,我使用以下代码得到了它:

@Imports Microsoft.AspNet.Identity
@Imports System.Security.Claims
@Code
    Dim db = New MyAppIdentityDbContext
    Dim curUserID = User.Identity.GetUserId()
    Dim myFirstName As String = (From users In db.Users Where users.Id = curUserID Select users.FirstName).FirstOrDefault
    Dim myRole As String = ""
    If curUserID IsNot Nothing AndAlso curUserID <> "" Then
        Dim userID = CType(User.Identity, ClaimsIdentity)
        Dim claims = userID.Claims
        Dim roleType = userID.RoleClaimType
        Dim myRoles = claims.Where(Function(c) c.Type = roleType).ToList()
        myRole = (myRoles.FirstOrDefault.ToString)
        'Here myRole contains whole https string - need to strip it to actual value
        Dim lastInd = myRole.LastIndexOf(" ")
        myRole = myRole.Substring(lastInd + 1, myRole.Length - (lastInd + 1))
    End If
End Code

【讨论】:

以上是关于如何在 _LoginPartial 的代码部分中获取用户角色?的主要内容,如果未能解决你的问题,请参考以下文章

如何在登录时向HttpContext用户添加声明

如何在php中获得下个月的同一天

MVC4不正确的模型错误

User.Identity.Name 返回的是 UserName 而不是 Name

C ++:我在一种方法中获得了一个迭代器,如何在另一种方法中通过迭代器修改原始列表?

带引导程序的语言切换器