代码之家  ›  专栏  ›  技术社区  ›  Glinkot

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

  •  6
  • Glinkot  · 技术社区  · 6 年前

    我将JWT与.netcore2.1一起使用

    [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
    

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

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

    我见过其他一些相当迂回的扩展授权类的方法,我宁愿避免。我只想访问令牌的细节,就像我编码它们一样,比如.Sub,以及我添加的自定义声明,比如“Name”和“Roles”。如何在.NETCore2.1中这样做?

    1 回复  |  直到 6 年前
        1
  •  21
  •   Shaun Luttin    6 年前

    试着铸造 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文件 财产。

        2
  •  2
  •   Ogglas    4 年前

    不需要施法,至少如果你正在使用 .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");
    

    从访问令牌可以读取如下值:

    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";
    }