【问题标题】:ClaimsPrincipal does not work in ASP .Net core MVC web appClaimsPrincipal 在 ASP .Net 核心 MVC Web 应用程序中不起作用
【发布时间】:2020-08-24 10:01:44
【问题描述】:

当用户登录我的应用程序时,我需要从声明中获取租户 ID。这完全适用于 ASP .Net 4.7 Mvc 应用程序。但它在 asp .net core mvc app (3.1) 中不起作用。

var tenantId = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value; 

它不断收到“对象引用未设置为对象的实例”这个错误。

【问题讨论】:

  • 以下网址显示“您要查找的资源已被删除、更改名称或暂时不可用。”
  • 我们无法直接访问该链接。它用于获取声明相关内容的架构。

标签: c# asp.net-mvc asp.net-core


【解决方案1】:

对于.Net Core 3.1 put,使用 System.IdentityModel.Tokens.Jwt;

对于控制器:

var token = HttpContext.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last();
var tokenClaims = new JwtSecurityToken(token.Replace("Bearer ", string.Empty));
var oid = tokenClaims.Payload["oid"].ToString();

对于 SignalRHub OnConnectedAsync():

var token = new JwtSecurityToken(Context.User.Identities.FirstOrDefault(x => x.IsAuthenticated).BootstrapContext.ToString());
var oid = token.Claims.FirstOrDefault(m => m.Type == "oid").Value;

【讨论】:

    【解决方案2】:

    ClaimsPrincipal.Current 未在 ASP.NET Core 中设置。相反,它使用依赖注入来提供依赖,例如当前用户的身份。

    有几个选项可用于检索当前经过身份验证的用户的 ClaimsPrincipal:

    • ControllerBase.User(MVC 控制器)
    • HttpContext.User(中间件)
    • 从调用方传入(无法访问 HttpContext 的库)
    • IHttpContextAccessor(过多传递用户身份时)

    您可以在documentation page 上找到有关此主题的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      相关资源
      最近更新 更多