我正在努力在我的一项服务中实现代表流程,该服务在某种程度上充当前端服务的中间件/后端,并且需要使用其上下文的用户调用后端 API。
目前,后端正在使用应用程序角色在不同端点上执行授权。我们定义了一个
User
和一个 Admin
角色(我们使用 Entra ID)。
对于我正在创建的示例,我拥有这两项服务(集成服务和后端服务)。
为了传递用户上下文,我想使用代表流程。 MS Learn 有一些详细信息 并指出以下内容:
为了使中间层服务向下游服务发出经过身份验证的请求,它需要从 Microsoft 身份平台获取访问令牌。它仅使用委托范围而不是应用程序角色。角色仍然附加到主体(用户),而不附加到代表用户运行的应用程序。发生这种情况是为了防止用户获得他们不应访问的资源的权限。
在我看来,应用程序角色不会添加到通过 OBO 流程生成的令牌中。
但是,我确实在令牌中看到应用程序角色弹出窗口。
我使用以下代码:
private readonly IAuthorizationHeaderProvider _authorizationHeaderProvider;
public MyController(
IAuthorizationHeaderProvider authorizationHeaderProvider
)
{
this._authorizationHeaderProvider = authorizationHeaderProvider;
}
[HttpGet("WeatherForecastWithWeatherUserScope", Name = "GetWeatherForecastWithWeatherUserScope")]
public async Task<ApiResponse> GetWithUserScope()
{
var accessToken = await this._authorizationHeaderProvider.CreateAuthorizationHeaderForUserAsync(new[] { "api://2a3f9f34-0ee2-4fe7-8b37-e8233c51e620/WeatherUser" });
accessToken = accessToken.Replace("Bearer ", "");
var backendDetails = await GetBackendDetails(accessToken, "/WeatherForecast/WithUserScope/");
var integrationServiceDetails = new IntegrationServiceCallDetails(
HttpContext.Request.Headers.Authorization.First()!,
username);
return new ApiResponse(integrationServiceDetails, backendDetails);
}
代币
accessToken
具有以下内容:
{
// Removed some properties for brevity
"aud": "2a3f9f34-0ee2-4fe7-8b37-e8233c51e620",
"iss": "https://login.microsoftonline.com/15a8d236-9fcd-4d34-a6d9-f09eb524ed78/v2.0",
"name": "Jan_V",
"oid": "bf63f1b5-6c1f-489c-8d70-e47a82deaa69",
"preferred_username": "[email protected]",
"roles": [
"Admin"
],
"scp": "user_impersonation WeatherAdmin WeatherUser",
"tid": "15a8d236-9fcd-4d34-a6d9-f09eb524ed78",
"ver": "2.0"
}
正如您在上面的摘录中看到的,我的应用程序角色
Admin
就在令牌中。
我很高兴它在那里,因为后端服务正在使用它进行授权,但看到它我有点惊讶。我是否误解了上面的引述,或者这里发生了其他事情?注意:分配给集成服务的托管身份未分配任何角色。
范围包含索赔
通常在 OAuth 中,您设计范围来包含声明。考虑具有以下范围的客户端,以便原始访问令牌中存在 3 个自定义声明:
Orders
CustomerId
和 Role
Payments
CustomerId
和 CreditRating
Attributes and Claims
设置下配置此类声明。
如果我使用代表流来删除Orders
范围,我想删除
Role
声明。如果我维持范围,我也会维持其主张。默认规则可能因授权服务器而异。最终,您在最终令牌中发出的声明应该由您决定。某些实现可能使您能够在代币发行时运行自定义逻辑来控制最终声明。