将身份验证从 Blazor 传递到 API,丢失一些声明

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

我有一个使用 OpenIdConnect 进行身份验证的 Blazor 应用程序。

设置如下:

.AddOpenIdConnect(options =>
{
    configuration.GetSection("Security").Bind(options);
    options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.ResponseType = OpenIdConnectResponseType.Code;
    options.SaveTokens = true;
    options.Scope.Add("openid");
    options.Scope.Add("profile");
    options.Scope.Add("email");
    options.UsePkce = true;
    options.GetClaimsFromUserInfoEndpoint = true;
    options.TokenValidationParameters = new TokenValidationParameters
    {
        NameClaimType = "name",
        RoleClaimType = "role"
    };
});

我还有一个 WebAPI,身份验证设置如下:

services.AddAuthorization(options =>
{
    // Configure the default policy
    options.FallbackPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
});

services.AddAuthentication("Bearer")
    .AddJwtBearer("Bearer", options =>
    {
        options.Authority = configuration["Security:Authority"];
    });

在我的 Blazor Server 应用程序中,我调用 API 并在标头中添加 access_token。

    var accessToken = await _httpContextAccessor.HttpContext.GetTokenAsync("access_token");

    request.Headers.Add("Authorization", $"Bearer {accessToken}");

这一切都适用于身份验证部分,我可以看到已通过身份验证的用户。但我在 Blazor Server 中看到的声明与 WebAPI 中的声明非常不同。在这两个地方,我都从

IHttpContextAccessor
获得了用户声明。

API 和应用程序中的权限是相同的。

知道这是怎么回事吗?

谢谢!

.net authentication asp.net-web-api blazor openid-connect
1个回答
0
投票

openidconnect 身份验证将获得

idToken
accessToken
。带有 openidconnect 的 blazor 前端将从
idToken
本身提取用户声明。而 api 额外用户从它收到的
accessToken
中声明。
你可以尝试通过jwt.io观察它们的区别。

.AddOpenIdConnect(options =>
{
...
    // Save the tokens (including the ID token)
    options.SaveTokens = true;
});

然后

        var authResult = await HttpContextAccessor.HttpContext.AuthenticateAsync();
        IdToken = authResult.Properties?.GetTokenValue("id_token") ?? "ID Token not found";
© www.soinside.com 2019 - 2024. All rights reserved.