【问题标题】:Getting "invalid_token" when accessing Web API with ADAL.js使用 ADAL.js 访问 Web API 时获取“invalid_token”
【发布时间】:2017-02-27 14:36:55
【问题描述】:

我遵循this 帖子中的想法。我只是做了一些更改,比如使用 ASP.net 核心和 Angular 2 前端运行在同一个端口上,使用 jwt 不记名令牌身份验证。

我正在使用 ADAL.js 对 Azure AD 进行身份验证,这个过程似乎运行良好。我从 Azure AD 获取我的令牌并将其保存在本地存储中。

当我使用保存在本地存储中的令牌调用我的 API 时,我得到 401

从 Angular 2 调用都驻留在同一端口上的 WebApi。

var token = localStorage["adal.access.token.keye1b88e53-810a-474d-93af-bb98c956d01e"];     
        console.log(token);
        let headers = new Headers({
            'Authorization': 'Bearer ' + token, 'Accept': 'application/json; odata.metadata=minimal'
        });
        let options = new RequestOptions({ headers: headers });
        return this.http.get('https://localhost:44375/api/values', options)
            .map((response: Response) => response.json()).subscribe((val) => {
        console.log(val);});

此呼叫返回带有此消息的 401

Bearer error="invalid_token", error_description="令牌已过期"

任何想法都值得赞赏。谢谢!

【问题讨论】:

    标签: azure-active-directory adal


    【解决方案1】:

    默认情况下,我们获取的令牌会在一个小时后过期。根据您的错误消息,您的令牌应该已经过期,每个令牌都会有一个过期时间戳,您可以查看本地存储中的密钥 adal.expiration.key1b88e53-810a-474d-93af-bb98c956d01e 以了解过期时间。

    实际上,如果您在应用程序中使用 adal-angular 模块,作为其 Github 存储库中的描述:

    您可能拥有的任何服务调用代码都将保持不变。 Adal 的拦截器会自动为每次拨出的电话添加令牌。

    我们不需要在呼出请求中手动设置 Authorization 标头。另外,如果你坚持,你可以尝试使用:

    config.headers['Authorization'] = 'Bearer ' + localStorage.getItem("adal.idtoken");
    

    并手动更新您的令牌。

    此外,您可以检查 adal.js 创建的本地存储中的所有键/值:

    【讨论】:

    • 我没有使用示例中提到的 adal-angular。由于 adal-angluar 与 Angular-2 不兼容。我们只是使用 Adal.js 进行身份验证。这就是为什么我在每次拨出电话时都设置授权标头的原因。而且,即使我正在更新令牌并发送请求,我仍然会看到同样的错误。
    • 现在,当我更新令牌时,我看到了Bearer error="invalid_token", error_description="The audience is invalid"
    • 这是由于 'aud' 声明不等于收件人所期望的结果。您使用什么运行时进行验证?
    【解决方案2】:

    在 Web API 端我改变了

    app.UseJwtBearerAuthentication(new JwtBearerOptions
            {
                Authority = Configuration["Authentication:AzureAd:AADInstance"] + Configuration["Authentication:AzureAd:TenantId"],
                Audience = Configuration["Authentication:AzureAd:Audience"]
            });
    

    app.UseJwtBearerAuthentication(new JwtBearerOptions {
                    Authority = Configuration["Authentication:AzureAd:AADInstance"] + Configuration["Authentication:AzureAd:TenantId"],
                    Audience = Configuration["Authentication:AzureAd:ClientId"],
                    TokenValidationParameters = new TokenValidationParameters { SaveSigninToken = true }
    
                });
    

    【讨论】:

    • 此更改是否有效?您是否能够摆脱错误消息“invalid_token”?
    【解决方案3】:

    您还可以在 Web API 和客户端应用程序中将 AD 应用程序的应用程序 ID 设置为相同的 **clientId**,并确保在清单中启用 **"oauth2AllowImplicitFlow": true,**(AD 的可用 Azure 门户)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 2020-03-04
      • 1970-01-01
      • 2019-04-02
      • 2018-04-24
      • 1970-01-01
      • 2017-12-16
      相关资源
      最近更新 更多