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

时间:2016-10-16 17:50:39

标签: asp.net-mvc vb.net roles

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

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

根据Marco评论中的链接,它提到使用ClaimsIdentity,但对我而言,它声明ClaimIdentity没有被宣布(Rick在去年8月留下了一条评论,解释说这对他来说不像过去2年发生的事情那样改变了。) / p>

我也试过这个,这与我在其他地方使用的控制器中的代码类似:

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但未处理   用户代码附加信息:值不能为空。

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

1 个答案:

答案 0 :(得分:0)

感谢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