首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Azure Active Directory获得一个访问令牌,由支架式天气预报Api接受?

如何从Azure Active Directory获得一个访问令牌,由支架式天气预报Api接受?
EN

Stack Overflow用户
提问于 2020-10-29 22:50:38
回答 3查看 2.3K关注 0票数 3

我正在尝试使用来自azure活动目录的访问令牌来构建一个新的WebApi。

我使用的是.net核心版本3.1和VisualStudio2019。

我使用"Asp.net核心web应用程序“模板创建了一个新项目,并选择了一个"API”项目,并将身份验证类型更改为"Work或School Account“,并将Api设置为Api://Automation/TestApi

然后,Visual为我提供了一个带有模拟天气预报服务的web,如果我注释掉此服务,它将在浏览器中按预期很好地扩展。它还在AzureActive目录中创建了一个应用程序注册。

在权限属性返回的情况下,我很难从客户端应用程序调用API,所以我决定使用postman调用API来查看到底发生了什么。

我在应用程序注册中添加了一个客户端秘密,visual创建并将一个postman请求放在一起,如下所示,使用Application ( client ) Id和api://Automation/TestApi/..default作为作用域。

这很好,并返回一个访问令牌,但是,当我尝试使用该访问令牌调用默认的天气预报端点时,我会得到一个HTTP 401未经授权的错误,在WWW-身份验证响应头中有以下内容

“承担者error=”“invalid_token”,error_description=“听众‘api://自动化/TestApi’是无效的”

我遗漏了什么吗?我找不到任何线索来了解观众的期望,也找不到任何明显的控制方法。

按照要求,这里是公开API屏幕的内容。

和我正在使用的解码jwt令牌

更新

下面我试了一下赵嘉的回答,结果没什么用。但是我记得刚才我问了一个问题,是关于错误的发行人的。,其结果是手动编辑API注册中的清单json,并设置"accessTokenAcceptedVersion":2

现在,我得到了一个以v2 guid为受众的clientId函数

但是,使用这个令牌仍然不起作用!!我现在得到一个关于发行者的错误:

Bearer error="invalid_token", error_description="The issuer 'https://login.microsoftonline.com/{{guid}}/v2.0' is invalid

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-11-04 22:27:15

我找到了一种更好的方法来做这件事,所以我想把答案作为我第一个答案的替代方案。

我找到了这个非常好的示例应用程序和教程,并完成了第一部分“桌面应用程序调用Web”,并生成了一个api,该api使用正确的端点并在更可预测的庄园中对令牌进行验证。如果您是在一个新的Web上声明,我建议使用它作为起点,而不是VisualStudio支架所使用的API。

要获取脚手架天气预测api以接受令牌(访问令牌)

  • 您需要为客户端和api单独注册应用程序,还需要一个范围,如@Carl赵和上面链接的教程所支持的那样。
  • 将Microsoft.AspNetCore.Authentication.AzureAD.UI nuget包替换为Microsoft.Identity.Web
  • 在配置服务中的services.AddAuthentication(...).AddAzureAdBearer(....)中替换对startup.cs的调用调用AddMicrosoftIdentityWebApiAuthentication
  • 删除使用Microsoft.AspNetCore.Authentication.*的指令,并添加使用Microsoft.Identity.Web;

下面是我的配置服务现在的样子

代码语言:javascript
复制
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMicrosoftIdentityWebApiAuthentication(Configuration);

        services.AddControllers();
    }

在我的另一个答案中显示的自定义发行者验证器不被重新量化,并且可以被移除。

票数 0
EN

Stack Overflow用户

发布于 2020-10-30 10:26:19

您错过了一些重要的步骤,您的访问令牌也是错误的,它缺乏必要的权限。你可以试着按照我的方法:

您需要创建两个应用程序,一个代表客户机应用程序,另一个代表api应用程序,然后使用客户机应用程序调用Web应用程序。

首先,您需要公开表示web api的应用程序的api,您可以根据以下过程配置它:

Azure portal>App registrations>Expose a API>Add a scope>Add客户端应用程序

由于使用的是客户端凭据流,接下来,需要定义api应用程序的清单,并将应用程序权限授予客户端应用程序(这是您自己定义的角色权限,添加权限时可以在My 中找到).Then,您需要单击管理同意按钮来授予管理员对此权限的同意。

是定义清单的过程。

这是为了授予客户端应用程序的权限:

最后,您可以为api应用程序请求一个令牌:

解析令牌,您将看到:

票数 1
EN

Stack Overflow用户

发布于 2020-11-02 17:51:48

我已经取得了一些进一步的进展,我将用它来给出我自己的答案。

生成的代码使用Microsoft.AspNetCore.Authentication.AzureAD.UI包v3.1.x验证令牌。

使用Fiddler,我可以看到它使用的是旧的端点,而不是当前的"V2.0“端点。

这的意义在于令牌版本指示在令牌中返回哪些受众和发行者。

在V1令牌中,听众是来自应用程序注册的“应用程序Id Url”,而发行者是"https://sts.windows.net/{tennantId}

在v2令牌中,用户是应用程序注册的客户机ID (GUID),而发行者是https://login.microsoftonline.com/{tenantId}/V2.0

根本的问题是,这个库期待的是某种混合令牌,它的受众值为v2.0令牌(例如客户机Id),但来自v1颁发者https://sts.windows.net/

我找不到办法让它查看v2.0端点来进行配置,但是我在without上找到了一个旧问题数目,这些问题都是在没有解决的情况下关闭的。

特别是

我的解决办法是在应用程序注册中设置"accessTokenAcceptedVersion":2,在应用程序注册上设置“清单”json。这将确保正确的受众在令牌中。

第二步是在启动类的ConfigureServices方法中添加自定义颁发者验证。这是我的密码

代码语言:javascript
复制
  AzureADOptions opt = new AzureADOptions();
  Configuration.Bind("AzureAd", opt);
  string expectedIssuer = $"{opt.Instance}{opt.TenantId}/v2.0";
  services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, options =>
        {
            options.TokenValidationParameters.IssuerValidator = (issuer, securityToken, validationParameters) =>
            {
                if (issuer == expectedIssuer) return issuer;

                throw new SecurityTokenInvalidIssuerException("Invalid Issuer")
                {
                    InvalidIssuer = issuer
                };
            };
        });

这确实让人觉得我在讨论错误的中间件和/或错误配置的中间件的根本问题,我不禁认为肯定有更简单的东西--这毕竟是从visual 2019生成的向导生成的初学者代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64600292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档