无法在 asp.net core 中使用 MSAL 1.1.0-preview 通过授权代码获取 AccessToken

2024-01-03

我按照以下官方步骤尝试了该场景“Web 应用程序在 Azure Ad B2C 中调用 Web API https://learn.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-web-api-dotnet“,唯一的区别是我正在使用ASP.NET核心。我正在使用 AuthorizationCode 来获取访问令牌,但它总是返回 id 令牌并且空访问令牌.

  • 创建 Azure AD B2C 租户 https://learn.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-get-started.
  • 注册一个网络 API https://learn.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-app-registration#register-a-web-api.
  • 注册网络应用程序 https://learn.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-app-registration#register-a-web-application.
  • 制定政策 https://learn.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-reference-policies.
  • 授予 Web 应用程序使用 Web api 的权限 https://learn.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-access-tokens#granting-permissions-to-a-web-api.

My code:

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
    AuthenticationScheme = OpenIdConnectDefaults.AuthenticationScheme,
    AutomaticChallenge = true,
    ClientId = aadB2cSettings.ClientId,
    MetadataAddress = $"{aadB2cSettings.Instance}{aadB2cSettings.Tenant}/v2.0/.well-known/openid-configuration?p={aadB2cSettings.B2cSignUpOrSignInPolicy}",
    PostLogoutRedirectUri = aadB2cSettings.RedirectUrl,

    ResponseType = OpenIdConnectResponseType.CodeIdToken,
    TokenValidationParameters = new TokenValidationParameters
    {
        NameClaimType = "name"
    },

    Events = new OpenIdConnectEvents
    {
        OnAuthorizationCodeReceived = async context =>
        {
            var authCode = context.TokenEndpointRequest.Code;
            var b2cAuthority = $"{aadB2cSettings.Instance}tfp/{aadB2cSettings.Tenant}/{aadB2cSettings.B2cSignUpOrSignInPolicy}/v2.0/.well-known/openid-configuration";
            var cca = new ConfidentialClientApplication(
                aadB2cSettings.ClientId, 
                b2cAuthority,
                aadB2cSettings.RedirectUrl, 
                new ClientCredential(aadB2cSettings.ClientSecret), 
                new TokenCache(), 
                null);

            try
            {
                var authResult = await cca.AcquireTokenByAuthorizationCodeAsync(authCode, new[] { "https://hulab2c.onmicrosoft.com/b2cdemo/all" });
                context.HandleCodeRedemption(authResult.AccessToken, authResult.IdToken);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    },

使用fiddler捕获请求,是:

POST https://login.microsoftonline.com/hulab2c.onmicrosoft.com/oauth2/v2.0/token?p=b2c_1_signuporsignin https://login.microsoftonline.com/hulab2c.onmicrosoft.com/oauth2/v2.0/token?p=b2c_1_signuporsigninHTTP/1.1

请求正文:

client_id=1ff91f47-08ee-4973-83f4-379ad7e0679c&client_info=1&client_secret=......&scope=https%3A%2F%2Fhulab2c.onmicrosoft.com%2Fb2cdemo%2Fall+offline_access+openid+profile&grant_type=authorization_code&code=...... ..&redirect_uri=https%3A%2F%2Flocalhost%3A44383%2F

Return:

{"id_token":"......","token_type":"承载","not_before":1494494423,"client_info":"......","scope":""}

所以只有 id 令牌,没有访问令牌。但我们应该在这里获取访问令牌,对吗?


终于找到了我的失败原因:获取AuthorizationCode的请求不包含目标范围。体现在代码中,对于aspnetcore中的OpenIdConnectOption,Scope参数是只读的,其默认值为“opened profile”。OpenIdConnectOption 中的范围是只读的 https://i.stack.imgur.com/LxwdQ.png

所以发送的默认授权码请求是:

GET ...... HTTP/1.1

因此,使用此授权代码来响应获取令牌,即使我们在令牌请求中设置了正确的范围,我们仍然无法获取访问代码,而只能获取 id 令牌,因为提供的授权代码仅适用于“openid 配置文件”。

为了解决这个问题,我们还需要将目标 Web api 范围添加到授权代码中。这是如何修复代码:

Events = new OpenIdConnectEvents
{
       OnRedirectToIdentityProvider = context =>
       {
            context.ProtocolMessage.Scope += $" offline_access {myapiscope}";

            return Task.FromResult(0);
       },
       ......
}

在AspNet中,我们不需要这样做,因为它的作用域不像aspnetcore那样是只读的,可以直接设置:

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

无法在 asp.net core 中使用 MSAL 1.1.0-preview 通过授权代码获取 AccessToken 的相关文章

随机推荐

  • 在 AngularJS 动态电子邮件验证元素中,当我填写电子邮件检查元素时,它会被重置

    这是 Angular JS 中的电子邮件检查元素代码几乎没问题 但这有一个问题 当我填写电子邮件检查元素时 它被重置 例子 我将其写入电子邮件检查元素 电子邮件受保护 cdn cgi l email protection 但这是重置 当我写
  • Symfony2加载条件配置

    我刚刚开始使用 Symfony2 所以我还是个菜鸟 我需要根据请求 uri 或特定路由加载配置文件 yml E G dynamicroute 应该加载dynamicroute yml and anotherdynamicroute 应该加载
  • 如何恢复中断的下载

    我正在尝试从我的 Yahoo 下载一个大文件 网站服务器显然是设置的 不是我设置的 如果下载未在 100 秒内完成 则会断开下载 文件足够小 通常可以成功传输 当数据速率较慢且下载断开时 是否有办法在发生断开的文件偏移处恢复 URLConn
  • 识别导致回发的控制

    我有一个在下拉列表选择上回发的页面 使用 AJAX 更新面板 根据下拉选择 页面上的其余 UI 是动态生成的 动态 UI 在页面加载时绘制 用于获取值Submit按钮点击 我面临的问题是 在下拉列表更改时 似乎会发生两次回发 一个绘制原始
  • 根据 pandas 数据框中的其他分类值填充分类值的缺失值

    我想用另一个类别中最常见的值填充 Pandas 数据框中分类值的缺失值 例如 import pandas as pd import numpy as np data type softdrink juice softdrink softdr
  • 使 p:calendar 只读

    我要实现
  • 选择所有数据包括另一个表,即使为空

    设置 1 员工表 employeeID firstName lastName 1 鞋子表 shouldD Employee员工ID shoeName shoeColor shoe Brand 我想选择 Employee 表中的所有行 即使鞋
  • R 中用于超大型数据集处理和机器学习的推荐包 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 看起来 R 确实是为处理可以完全拉入内存的数据集而设计的 建议使用哪些 R 包来对无法拉入内存的超大型数
  • java 扫描仪仅读取前 2048 个字节

    我使用 java util Scanner 使用以下代码从类路径读取文件内容 String path1 getClass getResource myfile html getFile System out println new File
  • Delphi 和单元中的最终确定

    我有两个单位unitS和unit 类 TFoo 在单元中声明 在完成unitS时调用B Free总是安全的吗 它如何取决于 dpr 中的unitS和unit的顺序 当执行unitA终结时 我可以确定unitB存在吗 unit unitB i
  • 构造函数中的对象参数

    首先 如果我的问题难以理解 我深表歉意 我很难准确地解释我需要帮助的内容 我对 Java 和按引用传递等概念很陌生 基本上 我需要知道为什么下面的代码不正确 如何告诉 Java 使用作为构造函数参数传入的对象的方法 再次致歉 感谢您的阅读
  • .net 异常捕获块

    以下 catch 块有什么区别 try catch and try catch Exception 我意识到 在任何一种情况下 异常实例都不可用 但是我可以用一个实例做一些其他实例做不到的事情吗 他们是almost相同 来自 C 语言规范
  • 如何在 Xcode 4.3 下用 Objective C 制作 9*9 网格视图?

    i have searched Xcode controls but doesn t found anything that makes a GridView like the one in the lecture below so how
  • 如何在 C# 中从二维数组中获取完整的行或列

    我不想使用锯齿状数组 并且我有一个二维数组 并且我想获得完整的列或行而不循环遍历它 有谁知道如何做到这一点 1 2 3 4 5 6 double array new double 2 3 Out 1 2 3 or 2 5 要从多维数组中获取
  • 验证 int 和 float64 的 Reflect.Type 的其他方法

    在golang中 JSON消息中的数字总是被解析为float64 为了检测它是否实际上是整数 我使用reflect TypeOf 检查其类型 不幸的是没有常数代表reflect Type intType reflect TypeOf 0 f
  • 将 DateTimeOffset 转换为 DateTime 并向该 DateTime 添加偏移量

    I have 日期时间偏移量 DateTimeOffset myDTO DateTimeOffset ParseExact 2015 01 15 17 37 00 0500 yyyy MM dd HH mm ss zzz CultureIn
  • 从头开始重新开发应用程序?

    这不是一个编程问题 但我觉得 SO 是放置它的正确位置 市场上有一个安卓应用程序 我们的工作是大幅升级应用程序 有太多需要改变的地方 以至于我们决定从头开始一个新项目 我的问题是 为了能够替换 升级 Play 商店中现有的应用程序 我们应该
  • 解码引用的可打印正确

    我有以下字符串 utf 8 Q 5Bproconact 2D Verbesserung 23 32 37 39 5D 28Neu 29 Stellvertretungen Benutzerrecht 2D andere k C3 B6nne
  • 在 NodeJS 后端使用 JWT 和 Active Directory 身份验证

    我正在构建一个由 Angular 前端和 Node JS 后端组成的 Intranet Web 应用程序 应用程序需要使用企业Active Directory 进行身份验证和授权 我正在考虑如何以安全的方式最好地实现这一点 我打算使用Act
  • 无法在 asp.net core 中使用 MSAL 1.1.0-preview 通过授权代码获取 AccessToken

    我按照以下官方步骤尝试了该场景 Web 应用程序在 Azure Ad B2C 中调用 Web API https learn microsoft com en us azure active directory b2c active dir