【发布时间】:2022-02-15 23:54:27
【问题描述】:
我有托管我的 Blazor Webasm 的服务器,我有 Blazor Webasm,我有我的后端 REST 服务。我控制的那 3 个(即可以更改代码)。授权是通过 Identity Server 完成的(在这里,我无法更改代码)。
到目前为止,它的工作原理是这样的,用户看到网页,登录,执行一些操作,请求发送到 REST 服务,验证授权和声明(某些操作需要管理员声明)。它有效。
但现在我想对普通用户隐藏管理员操作,为此我想检查声明。问题是,虽然 REST 服务看到了声明,但 blazor 没有——它只有少数“默认”声明,但不适用于我的范围。
REST 服务的配置非常简单:
services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(options =>
{
options.Authority = "identityserver_addresss";
});
而 Blazor webasm 使用这个:
builder.Services.AddOidcAuthentication((RemoteAuthenticationOptions<OidcProviderOptions> options) =>
{
// Configure your authentication provider options here.
// For more information, see https://aka.ms/blazor-standalone-auth
builder.Configuration.Bind("oidc", options.ProviderOptions);
});
builder.Services.AddHttpClient("api")
.AddHttpMessageHandler(sp =>
{
var handler = sp.GetService<AuthorizationMessageHandler>()!
.ConfigureHandler(
authorizedUrls: "rest_service_address",
scopes: new[] { "my_scope" });
return handler;
});
并且配置有入口:
"oidc": {
"DefaultScopes": [
"openid",
"profile",
"my_scope"
],
}
所以从表面上看它对我来说看起来不错,我在告诉我对哪个范围感兴趣,REST 服务得到它,但我不知道为什么 blazor wasm 看不到它(它只看到“默认”声明,用户 ID,用户名)。
那么如何告诉 blazor wasm 从给定范围获取声明,或者如何告诉 IS 将它们也包含在 blazor 中?
为了检查我在 Blazor wasm 中得到的声明,我打印了来自 AuthorizeView.Context.User 的所有声明。
更新
Blazor 令牌解码(取自“userinfo”请求):
{
"nbf": 1644922079,
"exp": 1645051679,
"iss": "https://identityserver_address",
"aud": [
"https://identityserver_address/resources",
"my_app_rc"
],
"client_id": "my_app_client",
"sub": "-guid-",
"auth_time": 1642149284,
"idp": "local",
"my_app_claim_type": [
"user",
"admin"
],
"jti": "ae61d547b81c970c135f2a13fb5e353a",
"scope": [
"openid",
"profile",
"my_scope"
],
"amr": [
"pwd"
]
}
代码中可见的声明类型:
sid
sub
auth_time
idp
amr
name
preferred_username
因此,令牌(至少已转移)具有我正在寻找的信息(声明保存在“my_app_claim_type”条目中),但从代码中我看不到它(我看到令牌中不存在更多声明,但它是另一个故事)。
【问题讨论】:
标签: blazor identityserver4 blazor-webassembly