当前位置: 首页 > 知识库问答 >
问题:

在ASP.NET Core Web API中使用Azure Active Directory令牌和UseJwtBearerAuthenticiation

厍光霁
2023-03-14

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

这在AAD中被配置为Web App/API。我有一个应用程序ID和一个由AAD给出的对象ID。此外,我将主页URL和应用程序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"
}
    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);
  });
            app.UseJwtBearerAuthentication(new JwtBearerOptions
        {
            Authority = Configuration["Authentication: AzureAd:AADInstance"] + Configuration["Authentication: AzureAd:TenantId"],
            Audience = Configuration["Authentication: AzureAd:Audience"]
        });

共有1个答案

何甫
2023-03-14

您的受众为什么说“AUD”:“https://graph.windows.net
应该说“AUD”:“https://yourwebapi.azurewebsites.net”或类似的内容。

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

parent.config.resourceURI可能是您从以下位置获取所需访问群体的来源:

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

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

有时叫做资源,有时叫做观众,有时叫做AUD...就是它是什么:)

 类似资料:
  • 我使用docusign身份验证流作为 登录时 让url=”https://account-d.docusign.com/oauth/auth?response_type=token 窗打开(url,“U self”);成功验证后,返回/token\u type/state中的access\u token/expires\u。 请指导如何refresh_token?refresh_token如何获得

  • 我们有一个简单的应用程序,只有两个消费者和5个endpoint。对于一个endpoint,我需要某种身份验证方式。我喜欢这样做的条纹方式,但我不知道我如何可以在spring Boot中构建这个。 “对API的身份验证是通过HTTP基本身份验证执行的。请提供API密钥作为基本身份验证用户名值。不需要提供密码。”

  • 我试图弄清楚我应该如何坚持身份验证。 假设用户使用电子邮件和密码成功进行身份验证。然后服务器生成并返回两个令牌: accesstoken(jwt过期15分钟)将存储在浏览器存储中 refreshtoken(jwt过期7天)作为安全cookie 当将访问令牌存储在本地存储(或会话存储)中时,React 应用程序将简单地检查它是否存在于存储中并继续渲染私有路由。因此,这意味着如果用户有一个无效/被盗的

  • 问题内容: 我正在尝试使用从Android的AccountManager接收的令牌而不是使用用户名和密码来实现IMAP gmail客户端。 Google为该IMAP示例提供了oauth2 http://code.google.com/p/google-mail- oauth2-tools/source/browse/#svn%2Ftrunk%2Fjava%2Fcom%2Fgoogle%2Fgoog