Blazor WebApi 身份信息

Posted

技术标签:

【中文标题】Blazor WebApi 身份信息【英文标题】:Blazor WebApi Identity Information 【发布时间】:2022-01-15 02:05:29 【问题描述】:

我无法从 API 中获取用户身份信息。 我的项目由一个独立的 WASM 应用、IDP 和 WebApi 组成。

我已经完成了所有设置并且它可以工作,但我需要的是来自 Blazor 客户端的调用,以从 api 获取一些数据。然后,API 使用用户的电子邮件地址来识别他们并为他们获取数据。

我查看了类似的问题,但解决方案不适用于我的项目。

[HttpGet("GetData")]
        public async Task<IActionResult> GetData()
        
            string test = User.Identity.Name; // returns null

            string username = "myuser@users.com";

            List<string> data= new List<string>();
            data= (await _dataRepository.GetData(username)).ToList();

            if (data.Count > 0)
            
                return Ok(data);
            
            else
            
                return NoContent();
            
        

那么我在哪里设置用户名有没有办法获取通过请求的用户的电子邮件?

已编辑 访问令牌:

  
  "alg": "RS256",
  "kid": "2D49329C75FC43C78590AF6F6A0EFDB2",
  "typ": "at+jwt"



  "nbf": 1639243158,
  "exp": 1639246758,
  "iss": "https://localhost:5000",
  "aud": "https://localhost:5000/resources",
  "client_id": "ATS",
  "sub": "4892725f-f6da-4a28-827a-ce666bb6f098",
  "auth_time": 1638729064,
  "idp": "local",
  "jti": "53CB2F8FCB2EB34E3501E2C210B59B5D",
  "sid": "8463E4AA74D7369C1176249ED8FA46B1",
  "iat": 1639243158,
  "scope": [
    "openid",
    "profile",
    "MY_API"
    "email"
  ],
  "amr": [
    "pwd"
  ]

【问题讨论】:

你的api使用的是什么认证方式? Oidc 身份验证 请发布您配置身份验证和授权的启动类的副本。同时发布示例 ID/访问令牌。 // 授权策略 var requireAuthenticationUserPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); builder.Services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme) .AddIdentityServerAuthentication(options => options.Authority = "localhost:5000"; options.ApiName = "MY_API"; options.LegacyAudienceValidation = true; ); 【参考方案1】:

首先,您通常会使用 [Authorize(...)] 属性保护您的控制器操作方法,并在 ASP.NET Core 中查找授权以获取更多详细信息。

其次,找不到姓名/邮箱时最常见的问题是你需要打开声明映射使用

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear();

这是因为默认情况下,Microsoft 和 OpenID 对声明名称应该是什么有不同的看法,因此明智的做法是首先清除此映射,然后再告诉 Microsoft 名称/角色声明的名称是什么通过设置:

opt.TokenValidationParameters.RoleClaimType = "roles";
opt.TokenValidationParameters.NameClaimType = "name";

有关索赔映射的更多详细信息,请访问:

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/claims?view=aspnetcore-6.0

【讨论】:

您好,我正在使用全局授权策略,因此所有控制器都需要授权。是否有任何关于第二位的文档/示例供我查看 了解正在发生的事情的最佳方法是在控制器中放置一个断点,然后查看 User 对象中实际存在的声明,并将其与令牌中的内容进行比较或在 UserInfo 端点中 查看我的更新答案。 您还需要将名称和电子邮件用户声明添加到访问令牌中。 (参见 IdentityServer 中的 ApiScope 或 ApiResources) 您在客户端/Blazor 中看到的名称/电子邮件基于 ID 令牌而不是访问令牌。这是两个不同的东西。所以 API 看不到 ID-token,只有 access-token。您需要知道它们是单独使用的。客户端不会查看访问令牌内的内容。您可以在问题中更新访问令牌的新副本吗?

以上是关于Blazor WebApi 身份信息的主要内容,如果未能解决你的问题,请参考以下文章

Blazor wasm 获取更多信息并添加到用户声明中

如何在没有 Microsoft 身份的情况下对 blazor 服务器进行 jwt 身份验证?

Blazor WebAssembly 授权

对如何在 Blazor App 中从 B2C 获取访问令牌感到困惑

如何在 Blazor WASM 中对当前经过身份验证的用户帐户信息执行 CRUD 操作?

将 Blazor 服务器配置为托管 WebAPI