我有一个带有 OIDC 和交互式服务器模式的 Blazor .NET8 应用程序;
Program.cs
中的配置是:
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"));
builder.Services.AddControllersWithViews()
.AddMicrosoftIdentityUI();
builder.Services.AddAuthorization(options =>
{
options.FallbackPolicy = options.DefaultPolicy;
});
这意味着用户身份验证发生在进入任何页面之前。
我想调用 Sharepoint API,我的理解是这需要访问令牌:
var request = new HttpRequestMessage(HttpMethod.Post, uploadUrl)
// ...
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
我的问题是:我怎样才能获得
token
?我在 Razor 页面中尝试了以下代码:
var authState = await ASP.GetAuthenticationStateAsync();
var token = authState.User.FindFirst(c => c.Type == "access_token")?.Value;
但是
token
总是返回 null; 为了调试目的,我打印了声明主体中的所有 Type
,但它们都不像访问令牌。
我还尝试了
AddBearerToken()
,如.NET 8中的新功能中所述,但这没有什么区别。
我已经查看了如何使用 OIDC 在 Blazor 服务器应用程序中获取访问令牌声明?链接的页面,但没有人将
access_token
作为声明。
我按照 此案例 将 AAD 身份验证集成到我的 .Net 8 Blazor Web 应用程序服务器端渲染项目中。使用下面的代码,以便我们可以使用
ITokenAcquisition
服务来生成访问令牌。
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi()
.AddInMemoryTokenCaches();
这是我的测试结果
@using Microsoft.Identity.Web
@rendermode InteractiveServer
@inject ITokenAcquisition TokenAcquisitionService
@code {
protected override async Task OnInitializedAsync()
{
var token = await TokenAcquisitionService.GetAccessTokenForUserAsync(new string[] { "User.Read" });
var token2 = await TokenAcquisitionService.GetAccessTokenForUserAsync(new string[] { "api://client_id/Tiny.Greet" });
}
}