在 Web Api Controller (.Net Core 2.1) 中获取声明和订阅

Posted

技术标签:

【中文标题】在 Web Api Controller (.Net Core 2.1) 中获取声明和订阅【英文标题】:Get claims and subscription in Web Api Controller (.Net Core 2.1) 【发布时间】:2019-03-07 02:28:49 【问题描述】:

我将 JWT 与 .Net Core 2.1 一起使用,而

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

我的控制器类上的装饰器。在 2.0 中,您似乎必须执行以下操作,但现在它已被标记为过时:

var authenticateInfo = await HttpContext.Authentication.GetAuthenticateInfoAsync("Bearer");
string accessToken = authenticateInfo.Properties.Items[".Token.access_token"];

我已经看到了一些其他相当迂回的扩展授权类等方法,我宁愿避免这些方法。我只是想访问令牌的详细信息,就像我对它们进行编码一样,例如.Sub,以及我添加的自定义声明,如“名称”和“角色”。如何在 .Net Core 2.1 中这样做?

【问题讨论】:

【参考方案1】:

尝试将HttpContext.User.Identity 转换为ClaimsIdentity

claimsIdentity = User.Identity as ClaimsIdentity;

// alternatively
// claimsIdentity = HttpContext.User.Identity as ClaimsIdentity;

// get some claim by type
var someClaim = claimsIdentity.FindFirst("some-claim");

// iterate all claims
foreach (var claim in claimsIdentity.Claims)

    System.Console.WriteLine(claim.Type + ":" + claim.Value);

以下是支持 HttpContext.User.Identity 属性的 .NET Core 特定文档。

HttpContext HttpContext.User ClaimsPrincipal ClaimsPrincipal.Identity

【讨论】:

谢谢。我可以在这里看到一些类似的东西(github.com/tjoudeh/AspNetIdentity.WebApi/blob/master/…),看起来这是旧的 Asp.Net,而不是 asp.net Core?我收到用户不包含身份定义的错误。 .NET Core User 将具有 Identity 属性,因为 HttpContext.User 返回具有 Identity 属性的 ClaimsPrincipal。我用相关 .NET Core 2.1 文档的链接更新了答案。 从我的阅读中我不相信这对于 WebAPI 是一样的。 (例如***.com/questions/19884619/…)。我真的只是想在请求参数中获取不记名令牌中的详细信息,而不是引用会话类型对象。 您引用的问题是使用完整框架而不是核心。请注意对 Web 表单的提及,并且问题来自 2013 年。听起来您想自己解析和读取 Bearer 令牌。大多数应用程序不需要这样做;相反,大多数应用程序依赖内置的 ASP.NET Core 中间件来验证/解析/读取 Bearer 令牌并在 User 对象中显示其声明。 我以为我很清楚想要在 Core 中做这件事,但不用担心。【参考方案2】:

不需要强制转换,至少如果您使用的是.Net Core 3.1。只需从控制器中访问这样的值:

var nameIdentifier = User.FindFirst(ClaimTypes.NameIdentifier);
var name = User.FindFirst(ClaimTypes.Name);
var givenName = User.FindFirst(ClaimTypes.GivenName);
var surname = User.FindFirst(ClaimTypes.Surname);
var email = User.FindFirst(ClaimTypes.Email);
var mobilePhone = User.FindFirst(ClaimTypes.MobilePhone);
var authenticationMethod = User.FindFirst(ClaimTypes.AuthenticationMethod);
var emails = User.FindFirst("emails");

您可以从 access_token 读取如下值:

var handler = new JwtSecurityTokenHandler();
var jwtSecurityToken = handler.ReadJwtToken(adb2cTokenResponse.access_token);

var givenName = jwtSecurityToken.Claims.First(claim => claim.Type == JwtRegisteredClaimNames.GivenName).Value;
var familyName = jwtSecurityToken.Claims.First(claim => claim.Type == JwtRegisteredClaimNames.FamilyName).Value;
//Unless Alternate email have been added in Azure AD there will only be one email here. 
//TODO Handle multiple emails
var emails = jwtSecurityToken.Claims.First(claim => claim.Type == ADB2CJwtRegisteredClaimNames.Emails).Value;

public struct ADB2CJwtRegisteredClaimNames

    public const string Emails = "emails";

    public const string Name = "name";

【讨论】:

以上是关于在 Web Api Controller (.Net Core 2.1) 中获取声明和订阅的主要内容,如果未能解决你的问题,请参考以下文章

为啥从 ASP.NET Core Web API 的 ControllerBase 与 Controller 派生?

在 Web Api Controller (.Net Core 2.1) 中获取声明和订阅

指定调用Web Api 2 Controller方法的正确路由

《ASP.NET5》Web API Controller Class学习

Method not found: then send request web api controller

csharp .net Rest Web Api Controller返回JSON格式大小写问题解决