我有一个使用 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 和应用程序中的权限是相同的。
知道这是怎么回事吗?
谢谢!
openidconnect 身份验证将获得
idToken
和 accessToken
。带有 openidconnect 的 blazor 前端将从 idToken
本身提取用户声明。而 api 额外用户从它收到的 accessToken
中声明。.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";