我在 Azure 中创建了一个应用程序来控制我正在开发的应用程序的身份验证。我开发了一个小程序来使用客户端密钥生成 access_token,并且我想使用控制器中的 [Authorize] 在我的 api 中验证此令牌。问题是,当我发送令牌时,应用程序返回 401 未经授权的代码。我在appsettings中添加了应用程序信息(clientId和TenantID),并在program.cs文件中添加了身份验证。
不久前我做了同样的实现,但在本例中我通过 Angular 前端调用 API。当时,我使用 Angular 中的 MSAL 库来登录和检索 idToken 并在请求中发送它。这个带有前端的应用程序工作得很好,但在这种情况下,使用客户端密钥生成令牌并发送 access_token 不起作用。
生成access_token的方法:
public static async Task LoginWithSecret()
{
var authority = $"https://login.microsoftonline.com/{ tenantId }";
var scope = "https://graph.microsoft.com/.default"
var app = ConfidentialClientApplicationBuilder
.Create(clientId)
.WithClientSecret(clientSecret)
.WithAuthority(new Uri(authority))
.Build();
var result = await app.AcquireTokenForClient(new[] { scope }).ExecuteAsync();
var accessToken = result.AccessToken;
Console.WriteLine($"{ accessToken }");
}
API应用程序设置文件:
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "*********************************",
"ClientId": "*********************************"
},
program.cs类:
IConfiguration configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddMicrosoftIdentityWebApi(configuration);
(...)
控制器:
[HttpPost]
[Authorize]
public async Task<ActionResult<bool>> MyMethod(ViewModel model) {
(...)
}
我尝试了几个例子,但没有一个起作用。正如我所说,我已经使用 API 和 Angular 前端实现了类似的功能,但在本例中,我使用了用户登录前端时 MSAL 库返回的 idToken。在这个示例中,我正在尝试,我没有登录屏幕,这就是我使用 clientsecret 来获取此令牌的原因。
请问谁能告诉我是否需要在 API 中进行更多配置?
谢谢
当您使用范围 https://graph.microsoft.com/.default 时,您将请求在向 Graph API 发出请求时使用的令牌。
如果这就是您想要的,那么您需要确保在 Entra ID 中配置应用程序注册的 API 权限。
因此,编辑您的应用程序注册并配置应用程序权限,以设置使用 Graph API 所需的权限。
如果您需要您的 AppX 调用您拥有的其他 AppY/ApiY,并授权该请求,那么最好的方法是为您的 AppY 注册一个应用程序(安全主体),然后在您请求令牌时在 AppX 上注册,您需要在范围内指定 AppY 的 client id,因此在这种情况下,您请求一个令牌来独占访问 AppY,并且您限制了令牌的范围。
假设您正在使用守护程序应用程序来调用 API,请点击描述该场景的链接:
https://learn.microsoft.com/en-us/entra/identity-platform/scenario-daemon-overview
有关应用程序注册权限的更多信息,请访问以下链接: