使用 Azure AD 的 API 后端 (.NET Core) 中的身份验证基础知识

     2023-03-08     286

关键词:

【中文标题】使用 Azure AD 的 API 后端 (.NET Core) 中的身份验证基础知识【英文标题】:Authentication basics in API Backend (.NET Core) using Azure AD 【发布时间】:2018-10-28 20:24:29 【问题描述】:

也许问题比标题更全面。 有很多关于身份验证、令牌、JWT、Azure AD 等的帖子,但所有这些帖子似乎都讲述了一个不同的故事,这使得基本概念,至少对我来说,有点不清楚。我将尝试用我的案例来解释我的问题。

我已经在 Visual 代码中使用 React 构建了一个前端应用程序,并在 Visual Studio .Net Core 2 (Web API) 中构建了一个后端应用程序。该应用程序托管在 Azure 中,我们希望使用 Azure AD 进行身份验证。

前端使用 Adal-React (https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-authentication-libraries) 和 Axios (https://github.com/axios/axios)。 在教程的帮助下,我在前端和 API(后端)中设置了配置,即使用 Azure 环境中列出的 TenantID 和 ClientID。

虽然我已经设置它并且它正在工作,但它的工作方式对我来说或多或少是不清楚的。

我将尝试解释我的应用程序中的当前工作流程,并在下面列出我当前的问题:

1 - 用户导航到前端应用程序,adal 检查用户是否经过身份验证,如果不是,则将人重定向到我们的 azure 登录环境,这是在 adal 配置中设置的(前端)如下:

  const adalConfig = 
         tenant: 'vhsprod.onmicrosoft.com',
         clientId: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx',
         endpoints: 
          api: 'https://xxxxx.onmicrosoft.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx (client id)',
         ,
         postLogoutRedirectUri: window.location.origin,
         redirectUri: 'http://localhost:3000/user-form',
         cacheLocation: 'sessionStorage'
        ;
        export const authContext = new AuthenticationContext(adalConfig);
        export const getToken = () => 
         return authContext.getCachedToken(authContext.config.clientId);
        ;

2 - 用户需要登录,并且正在检查用户是否存在于 Azure AD 环境中,如果存在,则用户被重定向回前端,我们得到了自己一个 令牌。

3 - 用户在前端打开需要来自后端的数据的表单/页面,正在使用刚刚收到的令牌进行 API 调用。调用是在前端使用axios完成的,也配置了axios:

export const axiosCallToMyAPI = axios.create(
  baseURL: 'http://localhost:52860/api/',
  timeout: 5000,
  headers: 'Authorization': 'Bearer ' + initialToken
);

初始令牌是从 Adal 接收的,我们刚刚收到的令牌:

let initialToken = sessionStorage.getItem('adal.idtoken')

4 - 正在调用 API,在这里我们还设置了使用 Azure AD 的配置 (appsettings.json):

"AzureAd": 
    "Instance": "https://login.microsoftonline.com/",
    "TenantDomain": "xxxx.onmicrosoft.com",
    "TenantId": "xxxx.onmicrosoft.com",
    "ClientId": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx"
  

5 - 在 API 的启动类中验证令牌:

services
                .AddAuthentication(sharedOptions =>
                
                    sharedOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
                    sharedOptions.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; 
                    sharedOptions.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; 
                )
                .AddJwtBearer(options =>
                
                    options.Audience = this.Configuration["AzureAd:ClientId"];
                    options.Authority = $"this.Configuration["AzureAd:Instance"]this.Configuration["AzureAd:TenantId"]";

                    options.Events = new JwtBearerEvents()
                    

                        OnTokenValidated = context =>
                        
                            return Task.CompletedTask;
                        
                    ;
                );

剩下的问题和我所做的假设(阅读了几篇文章)如下:

使用前端收到的 Azure 令牌调用 API,API 怎么知道这个令牌是“有效的”?我知道 API 的启动类使用事件OnTokenValidated,但是这背后的魔力是什么?是否纯粹使用正在接收的令牌检查appsettings 中配置的租户/客户端 ID? 在几篇文章中,他们使用/提到了 SecretKey / Signing Key,但在我的示例中,我没有实现 SecretKey,但它仍然有效。我是否需要在我的 API(后端)中实现密钥/签名密钥?有必要吗? 我还阅读了隐式流、OpenID 连接和其他一些术语。在我的示例中使用 Azure AD 身份验证并以这种方式执行时,我是否会自动执行 implicit flow(前端 --> 后端)并使用 openid connect 进行身份验证?换句话说,当使用 Azure 身份验证时,您是否会自动执行这些/最佳实践,还是应该继续执行? 令牌具有某些声明/。 Azure 提供的定义范围(您还可以在其中设置这些声明,如电子邮件和角色),但是在使用 AspNet(身份)时,您还可以将自己的声明添加到当前令牌/会话中,例如当我添加角色声明时从 aspnetidentity 到我的令牌。这些声明与原始声明有何不同(仍然是不记名/ jwt?),这是一个好习惯吗?

谁能确认/解释这些问题?

如果这个故事有点笼统,我深表歉意,但目前我们的试错率很高,我只是想澄清一下。

【问题讨论】:

【参考方案1】:

使用前端接收到的 Azure 令牌调用 API,API 怎么知道这个令牌是“有效的”?我知道 API 的启动类使用事件 OnTokenValidated 但这背后的魔力是什么?是否纯粹使用正在接收的令牌检查 appsettings 中配置的租户/客户端 ID??

您在配置身份验证时指定了授权。 身份验证处理程序在应用启动时从如下 URL 下载 OpenId Connect 元数据:https://login.microsoftonline.com/joonasapps.onmicrosoft.com/.well-known/openid-configuration。

它从那里获取公共签名密钥和有效的颁发者 URI。

处理程序检查令牌的数字签名是否与它获得的签名密钥相比有效、颁发者是否有效、受众是否有效以及令牌是否未过期。

在几篇文章中,他们使用/提到了 SecretKey / Signing Key,但在我的示例中,我没有实现 SecretKey,但它仍然有效。我是否需要在我的 API(后端)中实现密钥/签名密钥?有必要吗?

检查上面。

我还阅读了隐式流、OpenID 连接和其他一些术语。在我的示例中使用 Azure AD 身份验证并以这种方式执行时,我是否会自动执行隐式流(前端-> 后端)并使用 openid 连接进行身份验证?换句话说,当使用 Azure 身份验证时,您是否会自动执行这些/最佳实践,还是应该仍然执行它?

隐式流意味着客户端可以直接从授权端点获取访问令牌,而不是从令牌端点请求它。 单页应用程序将它与隐藏的 iframe 一起使用来获取访问令牌并刷新过期令牌。 它确实取决于用户与 Azure AD 保持活动状态的会话。 如果您有一个更“经典”的后端应用程序,您可能会使用授权代码流而不是隐式流。

令牌具有某些声明/。 Azure 提供的定义范围(您还可以在其中设置这些声明,如电子邮件和角色),但是在使用 AspNet(身份)时,您还可以将自己的声明添加到当前令牌/会话中,例如当我添加角色声明时从 aspnetidentity 到我的令牌。这些声明与原始声明有何不同(仍然是不记名/ jwt?),这是一个好习惯吗?

您的应用无法修改 Azure AD 令牌,句号。 如果您修改它,它的签名将不再有效。 相反,ASP.NET Core Identity 使用 cookie + session 来存储登录用户的声明。 因此,生成的用户会话将包含来自令牌的声明以及您在用户存储中拥有的声明。

【讨论】:

关于使用什么流的问题,不能说Azure AD(AAD)默认总是使用特定的流。但是@juunas 在他关于隐式流程的陈述中是正确的。要验证正在使用哪个流以及您是否正在接收,请检查发送到 AAD 的 URL 请求中的以下参数,这些参数由 ADAL 设置: 1. 范围:对于 OIDC,这必须有“openid”。 2. response_type:对于OIDC,必须包含“id_token”。如果存在“代码”,那么您还会收到一个 OAuth 不记名令牌。参考:preview.tinyurl.com/yaqatsua @juunas 好帖子!这当然可以解决问题。感谢您花时间详细说明我的问题! 流程基本上由发送到授权端点的response_type决定。如果设置为code,则使用授权码流。如果tokenid_token 则使用隐式流。如果两者结合,则混合流 :) 然后还有后端流... 更多信息在这里:docs.microsoft.com/en-us/azure/active-directory/develop/…

Azure API 管理 - 如何刷新访问令牌后端 API?

...API管理中创建了一个API,用于从后端API获取数据。后端API使用oAuth2和10分钟后过期的访问令牌。使用返回的刷新令牌,您可以获得一个新的访问令牌,该令牌再次有效期为10分钟。等等 查看详情

使用 Azure AD 和本地帐户保护 API

】使用AzureAD和本地帐户保护API【英文标题】:SecuringAPIwithAzureADandlocalaccounts【发布时间】:2020-08-1907:34:04【问题描述】:我想保护我的API,以便只有在AzureAD中进行身份验证并在我的应用程序中拥有本地帐户的用户才能调用它。... 查看详情

使用 URL 模板参数和函数后端进行 Azure API 管理

】使用URL模板参数和函数后端进行AzureAPI管理【英文标题】:AzureAPImanagementwithURLTemplateParametersandFunctionBackend【发布时间】:2021-09-1022:45:26【问题描述】:我正在尝试使用路由到Azure函数的url参数在AzureAPI管理上设置一个端点。例... 查看详情

Azure AD B2C 连接的用户使用 Graph AD API 更改密码

】AzureADB2C连接的用户使用GraphADAPI更改密码【英文标题】:AzureADB2CConnecteduserchangepasswordwithGraphADAPI【发布时间】:2017-01-0913:47:03【问题描述】:我们正在使用AzureADB2C,我正在尝试为登录用户实现changePassword功能。我们已按照本教... 查看详情

使用 Azure AD 使用 Web API 验证 Vue

】使用AzureAD使用WebAPI验证Vue【英文标题】:AuthenticateVuewithWebAPIusingAzureAD【发布时间】:2021-01-1212:09:02【问题描述】:我正在尝试使用vue-msal从Vue查询来自AzureADprotectedWebAPI的数据。WebApi:58ca819e-是在AzureAD中注册的webapi应用ID"AzureAd"... 查看详情

使用 Azure AD、ReactJS 和 NodeJS 验证用户并使用 Graph API

】使用AzureAD、ReactJS和NodeJS验证用户并使用GraphAPI【英文标题】:AuthenticateUsersanduseGraphAPIusingAzureAD,ReactJSandNodeJS【发布时间】:2017-04-1116:03:15【问题描述】:我有一个使用NodeJS+ReactJS创建的项目应用程序,我想要的只是使用AzureAD... 查看详情

带有 JWT Bearer 令牌和 ASP.NET Core 2 WebApi 的 Azure AD 用户信息

...2:32:49【问题描述】:我找到了一个tutorial,我可以在其中使用AzureAD凭据登录我的应用程序。在我的前端中,我使用的是Xamarin.Forms。在我的后端,我使用ASP.NE 查看详情

401- 使用 REST API Dynamics CRM 和 Azure AD 进行未经授权的身份验证

】401-使用RESTAPIDynamicsCRM和AzureAD进行未经授权的身份验证【英文标题】:401-UnauthorizedauthenticationusingRESTAPIDynamicsCRMwithAzureAD【发布时间】:2016-09-0923:44:52【问题描述】:我正在尝试使用AzureADoAuth2身份验证访问DynamicsCRMOnlineRESTAPI。... 查看详情

使用 Azure AD 承载令牌时身份验证失败,返回容器列表 [Azure Blob] [Azure AD OAuth 2.0] [REST API]

】使用AzureAD承载令牌时身份验证失败,返回容器列表[AzureBlob][AzureADOAuth2.0][RESTAPI]【英文标题】:AuthenticationFailedwhileusingAzureADBearerToken,toreturnlistofcontainers[AzureBlob][AzureADOAuth2.0][RESTAPI]【发布时间】:2021-06-0320:19:51【问题描述】:... 查看详情

ASP.NET 5 API - Azure AD B2C

...发一个应用程序,并且几乎完成了我的前端。所以我想从后端开始。我曾经在ASP.NET4中编程,但由于我开始了一个全新的应用程序(B2C和B2B),我认为在ASP.NET5API中编写它可能会很有趣。现在我最大的问题是身份验证。模板中没... 查看详情

使用 Azure Ad Auth 从 .NET Core Web API 读取/写入 Azure Blob

】使用AzureAdAuth从.NETCoreWebAPI读取/写入AzureBlob【英文标题】:Read/WriteintoAzureBlobfrom.NETCoreWebAPIusingAzurAdAuth【发布时间】:2021-10-1322:48:40【问题描述】:我正在尝试从我的API合并blob上传。于是创建了存储帐户和容器。并且身份验证... 查看详情

从 Angular 前端调用受 Azure AD 保护的 Web API

...10:59:36【问题描述】:我目前正在开发一个Angular前端,它使用MSAL对用户进行身份验证。此前端应调用受AzureActiveDirectory保护的Web-API(也托管在Azure中)。虽然我很容易设法使用Angular 查看详情

无法验证从 Azure AD 获得的访问令牌签名以保护 Web API

...【发布时间】:2019-08-1008:15:09【问题描述】:我正在尝试使用隐式流使用AzureAd保护我的Webapi(.netcore2.2)。我使用Azure门户>AzureActiveDirect 查看详情

使用 Azure AD 通过 OAuth2 对 Azure API 管理进行身份验证

】使用AzureAD通过OAuth2对AzureAPI管理进行身份验证【英文标题】:AuthenticateAzureAPIManagementwithOAuth2usingAzureAD【发布时间】:2021-04-0409:18:00【问题描述】:我正在尝试通过阅读文章通过AzureAD使用OAuth2保护APIMAPI:ProtectawebAPIbackendinAzureAP... 查看详情

哪个图形 API 应与 Azure AD B2C 一起使用

】哪个图形API应与AzureADB2C一起使用【英文标题】:WhichGraphAPIshouldbeusedwithAzureADB2C【发布时间】:2017-10-0121:28:45【问题描述】:我们正在考虑在应用程序中使用AzureADB2C,但我对在使用AzureADB2C时使用哪个包感到困惑。这个问题讨论... 查看详情

使用 Graph API 更改 Azure AD B2C 用户密码

】使用GraphAPI更改AzureADB2C用户密码【英文标题】:ChangeAzureADB2CUserPasswordwithGraphAPI【发布时间】:2018-01-1613:44:30【问题描述】:我正在尝试使用SampleGraphAPI应用程序更改用户的密码,但我得到:调用图形API响应时出错:"odata.error":"... 查看详情

Azure AD 在 Web API 中使用来自客户端应用程序的令牌

】AzureAD在WebAPI中使用来自客户端应用程序的令牌【英文标题】:AzureADusingtokenfromclientapplicationinWebAPI【发布时间】:2020-03-2804:17:45【问题描述】:我有以下设置:2个客户端应用程序(XamarinForms和WPF)和一个WebAPI(.NETCore2.0)。客... 查看详情

在 Web API 上验证 Azure AD 令牌的问题

...点中的WebAPI相同。认证是一样的。测试1:当我要求站点A使用其自己的API来获 查看详情