如何使用 .NET 8 在 Blazor 中获取 OIDC 访问令牌

问题描述 投票:0回答:1

我有一个带有 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
作为声明。

asp.net-core blazor openid-connect access-token .net-8.0
1个回答
0
投票

我按照 此案例 将 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" });
    }
}

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.