ASP.NET Core 3.1:API 控制器中的 User.Identity.Name 为空,但声明名称存在

2024-02-03

我正在将 Identity Server 添加到我现有的项目中。基本上我已经准备好了一切,但是当我向 API 发出请求时,User.Identity.Name一片空白。但是,那User.Identity.Claims包含名称声明:

我知道通过以下方式获取用户名的方法HttpContext.User.FindFirstValue(ClaimTypes.Name),但是这需要大量的代码重构,所以我宁愿避免这种方式。

我按照以下方式在身份服务器中配置了 ApiResources:

public static IEnumerable<ApiResource> ApiResources => new[]
{
    new ApiResource
    {
        Name = "my-api",
        DisplayName = "My API",
        Description = "My API",
        Scopes = new List<string> { "my-api"},
        UserClaims = new List<string> {
            JwtClaimTypes.Email,
            JwtClaimTypes.Name,
            JwtClaimTypes.Subject,
            JwtClaimTypes.Role,
        }
    }
};

和客户:

public static IEnumerable<Client> Clients =>
    new List<Client>
    {
        new Client
        {
            // ...
            AllowedScopes =
            {
                IdentityServerConstants.StandardScopes.OpenId,
                IdentityServerConstants.StandardScopes.Profile,
                IdentityServerConstants.StandardScopes.Email,
                "name",
                "roles",
                "my-api",
            }
        }
    };

API项目中的身份验证设置:

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{
    options.Authority = config["IdentityServer:Domain"];

    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidIssuer = config["IdentityServer:Domain"],
        ValidateAudience = false
    };
});

services.AddAuthorization(options =>
{
    options.AddPolicy("ApiScope", policy =>
    {
        policy.RequireAuthenticatedUser();
        policy.RequireClaim("scope", "my-api");
    });
});

请建议我做错了什么?


问题在于,Microsoft 和 OpenID connect 对于“名称”声明的名称应该是什么有不同的看法。因此,您需要做的是告诉系统名称声明的名称是什么,方法是:

    .AddJwtBearer(opt =>
    {
        ...      
        opt.TokenValidationParameters.RoleClaimType = "roles";
        opt.TokenValidationParameters.NameClaimType = "name";
        ...
    }

为了补充这个答案,我写了一篇博客文章,详细介绍了这个主题:调试 ASP.NET Core 中的 JwtBearer 声明问题 https://nestenius.se/2023/06/02/debugging-jwtbearer-claim-problems-in-asp-net-core/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET Core 3.1:API 控制器中的 User.Identity.Name 为空,但声明名称存在 的相关文章

随机推荐

  • 将 ssis 中的 sql server 查询输出导出到文本文件,包括列标题

    我一直在尝试将 SqlServer sql 查询 存储过程 的输出导出到文本文件 我使用带有 OLEDB 源和平面文件目标的数据流任务来实现它 我还想在文本文件中获取列标题以及查询结果 但我不知道如何包含列标题 我想在 SSIS 中动态地执
  • 函数式编程中的引用透明性

    我是 JS 新手 正在学习函数式编程 并遇到了 引用透明度 这个术语 另外 我发现了这样的说法 引用透明度表明用纯函数的值替换纯函数是安全的 这是否意味着只要函数变热 使用 RT 就可以让 JIT 编译器轻松地用函数的返回值替换函数 真的吗
  • 如何跨多个页面传递多个变量?

    我的网站涉及用户通过多页表单提交数据 我可以将一页上提交的数据直接传递到下一页 但是如何将其发送到之后的页面呢 这是我正在做的事情的一个非常简化的版本 Page 1 Page 2
  • 在 HTML+CSS 中的活动菜单项下添加箭头

    我正在尝试生成如下菜单 菜单中有多个项目 活动的项目后面有一个箭头 菜单项是类似以下代码的标签 div class menuCenter div class linksWrapper a href Home a a class menuCe
  • Firefox 中调整大小时背景图像下的线条闪烁

    我正在构建一个网站 其标题中有一个全宽背景图像 可随页面调整大小 在 Firefox 中调整图像大小时 图像下方会出现一条不寻常的闪烁水平线 该线不会完全显示 但会在尺寸更改时闪烁 该线出现在背景图像的底部 而不是标题元素的底部 仅当我在
  • 尝试使用 .toUpperCase() 将字母转换为大写...不起作用?

    我试图使用 toUpperCase 将数组中的字符转换为大写 但它不起作用 我很确定我的逻辑是正确的 所以不确定为什么它不起作用 var test hello 3 function LetterChanges str var testArr
  • 如何在Python中水平放置单选按钮

    AANTAL 1 1 2 2 3 3 4 4 5 5 6 6 v StringVar v set 1 for text mode in AANTAL but Radiobutton Main padx 20 pady 10 font ari
  • Magento 和 Paypal 税务舍入问题

    我对 Paypal 和 Magento 1 7 0 2 有一些舍入问题 网站上的所有价格均含税 税费按 20 增值税 计算 我去结账 一切都正确 然后我会点击下订单 Paypal 就会像这样 这是不正确的 因为现在总计少了 1p 这似乎是由
  • 表单元素未出现在 $scope 中

    这是我的表格的开始 div 这是我的控制器 app controller Customer scope function scope alert scope CustomerForm scope CustomerForm未定义 表格不应该添
  • RHEL 上的 Docker CE - 要求:container-selinux >= 2.9

    我正在尝试安装Docker CE on RHEL使用这个link https stackoverflow com questions 42981114 install docker ce 17 03 on rhel7 这是我的 RHEL 版
  • 使用 execv(C 语言)从 Linux 命令提示符运行命令

    到目前为止 我唯一感到困惑的部分是如何设置 execv 并使用第一个参数作为当前工作目录 我已经尝试过两个 和 都没有在屏幕上执行任何操作 也一样 和 我对如何让 execv 运行这样的事情感到困惑 prog ls t al 并让它在程序执
  • Scala 按索引过滤列表

    我想用函数式的方式来编写它 我能做的最好的就是 list zipWithIndex filter tt Tuple2 Thing Int gt tt 2 3 0 unzip 1 获取元素 0 3 6 有没有更易读的 Scala 习惯用法 如
  • 有没有办法从 Flurry API 获取报告的用户 ID?

    我有一个使用 Flurry 的 iOS 游戏 因此我通过 Flurry setUserID USER ID 向 Flurry 发送每个玩家的唯一 ID 几个小时后 我从 Flurry 页面 gt 事件 gt 事件日志 gt 获取此 ID下载
  • 在 Git 中强制添加子模块内容

    我在一所学校编码 要求我们使用 git 将所有工作提交到他们的服务器 每个作业都有自己的文件夹 该文件夹有自己的 git 目录 我试图将父文件夹推送到我的 github 但是当我推送时 它实际上并没有上传文件夹内的代码 因为它被视为子模块
  • 在 C# 中获取输入的正确方法是什么,Convert 与 Parse

    我看到了一些在 C 中获取用户输入的其他方法 这真的很令人困惑 我可以使用这两种方式来获取输入还是仅用于浮动 是否有更多方式获取输入 float myAge myAge Convert Toint64 Console ReadLine vs
  • 从数据库中删除满足条件的条目的最有效方法是什么?

    AFAIK 没有直接的方法可以使用谓词删除实体 例如 DbSet RemoveWhere gt 我尝试了几种删除方法 但不知道哪种方法最有效 你能指出我正确的方向吗 我尝试的第一个也是最基本的事情是 context Users Remove
  • JavaScript 中的数字格式与 C# 类似

    有没有一种简单的方法可以在 JavaScript 中格式化数字 类似于 C 或 VB NET 中可用的格式化方法ToString format provider or String Format 一般来说 在 JavaScript 中设置数
  • 对多个视图控制器中的一个观察者使用 NSNotificationCenter 选择器

    我可以使用选择器吗getUpdate 在多个视图控制器中 我正在注册我的LevelViewController作为双方的观察者GameViewController and WinViewController 后 2 个视图控制器都有一个后退
  • Admob 与 Android:无法解析清单中的 android:configChanges

    我正在尝试使用 Admob 将广告添加到我的 Android 应用程序中 但遇到了困难 Admob 表示需要以下信息logcat E Ads 26043 The android configChanges value of the com
  • ASP.NET Core 3.1:API 控制器中的 User.Identity.Name 为空,但声明名称存在

    我正在将 Identity Server 添加到我现有的项目中 基本上我已经准备好了一切 但是当我向 API 发出请求时 User Identity Name一片空白 但是 那User Identity Claims包含名称声明 我知道通过