如何解决ClaimsPrincipal在ASP .Net核心MVC Web应用程序中不起作用
当用户登录我的应用程序时,我需要从声明中获取租户ID。使用ASP .Net 4.7 Mvc应用程序完全可以正常工作。但是它在asp .net核心mvc应用程序(3.1)中不起作用。
var tenantId = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;
它不断收到“对象引用未设置为对象实例”的错误。
解决方法
ClaimsPrincipal.Current未在ASP.NET Core中设置。相反,它使用依赖项注入来提供依赖项,例如当前用户的身份。
有几个选项可用于检索当前经过身份验证的用户的ClaimsPrincipal:
- ControllerBase.User(MVC控制器)
- HttpContext.User(中间件)
- 从调用方传入(没有访问HttpContext的库)
- IHttpContextAccessor(在过多传递用户身份时)
您可以在documentation page上找到有关此主题的更多信息。
,对于.Net Core 3.1,使用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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。