Azure AD客户端凭据和交互在同一ASP.NET核心API中



我有一个ASP.NET Core(3.1(web API,带有几个客户端UI应用程序。身份验证通过Azure AD,一切正常,使用:

services.AddAuthentication()
.AddAzureADBearer(options => Configuration.Bind("AzureAD", options))

我还想允许机器对机器API访问使用客户端凭据流。我也可以使用相同的应用程序注册来实现这一点。

然而,我需要一种方法来验证请求正在使用的流,因为我想向我不希望交互式用户访问的API请求公开使用客户端凭据API的功能

实现这一目标的最佳方法是什么?

我在AAD中创建了一个单独的应用程序注册,用于客户端凭据授予的客户端机密处于启用状态,并且我让它向令牌添加权限(作为角色(。在API的应用程序注册中,我已授予客户端凭据应用程序注册权限。但是,如果我用这个流获得了一个令牌,我就无法进行身份验证。我发现更改令牌请求中的作用域以匹配API应用程序注册上的作用域会给我一个令牌,使我可以访问API,但它缺少应用程序角色。

其中一个是交互式令牌,有一些特定于用户的声明。因此,一种解决方法是检查这些声明的存在,并禁止我想要限制的功能(如果存在(,但这似乎有点棘手。

我还能做什么?有没有一种方法可以使两个登录流都工作?还是我错过的另一个选择?

如果其他人需要让它工作,我通过从切换来让它工作

services.AddAuthentication()
.AddAzureADBearer(options => Configuration.Bind("AzureAD", options))

至:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.MetadataAddress = $"https://login.microsoftonline.com/mydomain.onmicrosoft.com/.well-known/openid-configuration";
options.TokenValidationParameters.ValidateAudience = false;
});

正如问题中提到的,还有一些额外的步骤。我在AAD中创建了一个单独的应用注册,并在API的应用注册中授予了新应用注册的权限。在新的应用程序注册中,我必须编辑清单,以获得我希望作为角色包含的作用域(作用域仅分配给用户令牌,而不是通过客户端凭据授予获得的令牌(。

有了具有角色数据的令牌,对于对我的受限端点的请求,我可以检查它是否在那里:

public bool ValidateScope(string scopeName)
{
return _httpContextAccessor.HttpContext.User.IsInRole(scopeName);
}
bool authorised = _clientCredentialsService.ValidateScope("restricted");
if (!authorised)
{
throw new UnauthorizedAccessException("Attempt to access restricted functionality as a regular user");
}

(我有一个过滤器,它会拾取这个异常,并将其作为403气泡发送给消费者(。

如果其他人正在执行此操作,您可以看到我已将ValidateAudience设置为false,因此如果执行此操作的话,您可能需要添加一些策略。

最新更新