【问题标题】:Using Azure Active Directory token in ASP.Net Core Web API with UseJwtBearerAuthenticiation在 ASP.Net Core Web API 中使用 Azure Active Directory 令牌和 UseJwtBearerAuthenticiation
【发布时间】:2018-03-10 16:41:42
【问题描述】:

我有一个用 Ionic Framework 3 编写的本机客户端应用程序。我有一个用 ASP.NET Core 1.1 编写的 Web API。我想使用 Azure Active Directory 来管理对 Web API 的访问。

我在 Azure Active Directory 中注册了两个应用程序:移动应用程序和 Web API。移动应用程序具有授予访问 Web API 所需的权限。下面是来自我们的 Azure 管理员门户的权限的屏幕截图:

Mobile App Permissions

这在 AAD 中配置为本机应用程序。我有 AAD 提供的应用程序 ID 和对象 ID。另外,我添加了一个任意的重定向URI,我认为基于几个教程不需要解析,该URI是http://mobileCRMApp。查看 AAD 中的属性,主页 URL 为空白,注销 URL 为空白。

API Permissions

2017 年 10 月 3 日粗体更新:

这在 AAD 中配置为 Web 应用程序/API。我有 AAD 提供的应用程序 ID 和对象 ID。此外,我将主页 URL 和 App ID URI 都设置为匹配我的 Web API 的根 (https://crm.mycompany.com)

我的 Ionic 客户端应用程序大致通过以下方式成功通过 AAD 身份验证:

authenticate(userID, authCompletedCallback) : any {
  let parent = this;
  //this.context = new AuthenticationContext(this.config.authority);
  let context = this.msAdal.createAuthenticationContext("https://login.microsoftonline.com/myTenantId");
  console.log(context);
  context.acquireTokenAsync(parent.config.resourceUri, parent.config.clientId, parent.config.redirectUri, userID, "")
          .then(authCompletedCallback)
          .catch((e: any) => console.log('Authentication failed', e));
}

登录过程在应用程序中运行良好,回调接收到一个令牌,我可以使用 jwt.io 将其有效负载大致转换为以下内容:

{
 "aud": "https://crm.mycompany.com/",
 "iss": "https://sts.windows.net/someID/",
 "iat": 1506539211,
 "nbf": 1506539211,
 "exp": 1506543111,
 "acr": "1",
 "aio": "someOtherID",
 "amr": [
   "pwd"
 ],
 "appid": "appID",
 "appidacr": "0",
 "e_exp": 262800,
 "family_name": "Walter",
 "given_name": "Philip",
 "ipaddr": "someAddress",
 "name": "Philip Walter",
 "oid": "someOtherID",
 "onprem_sid": "someOtherID",
 "puid": "stuff",
 "scp": "user_impersonation",
 "sub": "e_X7WlAoVS2vzXm1pr3kcDOrET7czcC0f8-YRU_2DJ8",
 "tenant_region_scope": "NA",
 "tid": "ourTenantID",
 "unique_name": "pwalter@advtis.com",
 "upn": "pwalter@advtis.com",
 "uti": "RLvLlibQHESwmujVBBdlAA",
 "ver": "1.0"
}

然后我获取令牌并将其与来自 Ionic 客户端应用程序的 API 的 http 请求一起发送,大致如下:

    let headers = new Headers();
headers.append('Authorization', 'Bearer ' + this.authToken.accessToken);
let options = new RequestOptions({ headers : headers });
this.data.http.get(url, options).map(res => res.json()).subscribe((data) => {
     console.log(data);
  });

API 然后在 Startup.cs 中有以下内容

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

所以,我可以在客户端应用程序中通过 AAD 登录,我收到一个令牌,但是当我向上面带有 [Authorize] 标记的路由发送请求时,我仍然从 Web api 收到 401 未经授权的响应.

我显然在配置 API 或权限时做错了。我使用几个不同的教程把它放在一起,因为我找不到任何专门针对我的用例的东西。关于我做错了什么或如何解决问题的任何想法?

【问题讨论】:

    标签: asp.net-web-api ionic-framework azure-active-directory json-web-token


    【解决方案1】:

    为什么你的听众会说"aud": "https://graph.windows.net"
    它应该是 "aud": "https://yourWebApi.azurewebsites.net" 或类似的东西。

    您上面包含的令牌仅适用于 Graph API,任何其他受 Azure AD 保护的资源都会拒绝它,包括您的 Web API,因为它希望受众匹配自我。

    parent.config.resourceUri 可能是您从中获取所需受众的地方:

    context.acquireTokenAsync(
        parent.config.resourceUri,
        ...
    

    根据RFC 7519

    "aud"(受众)声明标识了 JWT 的目标收件人。打算处理 JWT 的每个主体都必须使用受众声明中的值来标识自己。 如果处理该声明的主体在此声明存在时未使用“aud”声明中的值标识自己,则必须拒绝 JWT。 在一般情况下,“aud”值是区分大小写的字符串数组,每个字符串都包含一个 StringOrURI 值。在 JWT 有一个受众的特殊情况下,“aud”值可能是包含 StringOrURI 值的单个区分大小写的字符串。受众价值的解释通常是特定于应用程序的。使用此声明是可选的。

    有时称为resource,有时称为audience,有时称为aud……就是这样:)

    【讨论】:

    • 我尝试将 parent.config.resourceUri 更改为我尝试访问的 Azure 资源(Web api)的 App ID URI。我现在得到一个令牌,其aud 等于我的本机应用程序的clientId。对我的 Web API 的请求仍然被 401 拒绝。我会以正确的方式解决这个问题吗?我在 Azure 中注册了两个应用程序:nativeApp 和 WebAPI。 nativeApp 已授权访问 WebAPI。如上所述,nativeApp 从 AAD 获取令牌,然后在向 WebAPI 发出请求时显示该令牌。这是正确的流程吗?如果是这样,我肯定还有这些 URI 的错误??
    • Parent.config.ResourceUri 应该是 https://yourweb.api.com 或其他任何位置。
    • 我现在看到了一个 URL,但我仍然对此感到困惑。假设我的 api 位于 https://crm.mycompany.com/api/ - 我在根目录中发生了其他事情,例如基于 Web 的 UI。我在 Azure 中注册了一个相应的应用程序,然后它拥有所有自己的 URI,例如 App ID URI、主页 URL、重定向 URL 等。顶部提到的我的 api 的实际 URL 不在 Azure 的任何地方,如果我把它在令牌请求中,我收到一个错误,指出用户中断了流程。到目前为止,我感谢您的帮助!请帮助我了解我在哪里搞砸了。
    • 我也对如何使用useJwtBearerAuthentication 配置我的 Web API 感到困惑我错过了一些重要的东西。
    • 我很困惑,所以您的 Web API 没有在 Azure AD 中注册?也许您应该使用 Azure AD 中权限的屏幕截图来编辑您的问题,因为我对什么是什么有点迷茫。即使真正的 API 位于 /api 之下,您的听众也应该阅读 https://crm.mycompany.com
    猜你喜欢
    • 2019-01-17
    • 1970-01-01
    • 2017-02-17
    • 2018-05-29
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 2018-03-24
    相关资源
    最近更新 更多