- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个新项目,该项目将针对用户可以和不能访问/查看的内容制定一些深入的政策,使用 Identity Server 4。
我正在尝试使用 AuthorizeView 和策略来隐藏导航中的选项,但 View 是级联的,这意味着我有这样的事情:
<MatNavMenu>
<MatNavItem Href="/home" Title="Home"><MatIcon Icon="@MatIconNames.Home"></MatIcon> Home</MatNavItem>
<MatNavItem Href="/claims" Title="Claims"><MatIcon Icon="@MatIconNames.Vpn_key"></MatIcon> Claims</MatNavItem>
<AuthorizeView Policy="@PolicyNames.IdentitySystemAccess">
<Authorized>
<AuthorizeView Policy="@PolicyNames.AccessManagement">
<Authorized>
<MatNavSubMenu @bind-Expanded="@_accessSubMenuState">
<MatNavSubMenuHeader>
<MatNavItem AllowSelection="false"> Access Management</MatNavItem>
</MatNavSubMenuHeader>
<MatNavSubMenuList>
<AuthorizeView Policy="@PolicyNames.User">
<Authorized>
<MatNavItem Href="users" Title="users"><MatIcon Icon="@MatIconNames.People"></MatIcon> Users</MatNavItem>
</Authorized>
</AuthorizeView>
<AuthorizeView Policy="@PolicyNames.Role">
<Authorized>
<MatNavItem Href="roles" Title="roles"><MatIcon Icon="@MatIconNames.Group"></MatIcon> Roles</MatNavItem>
</Authorized>
</AuthorizeView>
</MatNavSubMenuList>
</MatNavSubMenu>
</Authorized>
</AuthorizeView>
</Authorized>
</AuthorizeView>
options.AddPolicy(PolicyNames.User, b =>
{
b.RequireAuthenticatedUser();
b.RequireClaim(CustomClaimTypes.User, "c", "r", "u", "d");
});
当我的应用程序运行时,菜单中的任何项目都不显示,除了不受 AuthorizeView 保护的主页和声明项目。
最佳答案
问题是由于当前缺乏对 Blazor 读取作为数组发送的声明的支持。
例如用户:["c","r","u","d"]
无法读取。
要解决此问题,您需要添加 ClaimsPrincipalFactory .
例如
using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
using Microsoft.AspNetCore.Components.WebAssembly.Authentication.Internal;
using System.Linq;
using System.Security.Claims;
using System.Text.Json;
using System.Threading.Tasks;
namespace YourNameSpace
{
public class ArrayClaimsPrincipalFactory<TAccount> : AccountClaimsPrincipalFactory<TAccount> where TAccount : RemoteUserAccount
{
public ArrayClaimsPrincipalFactory(IAccessTokenProviderAccessor accessor)
: base(accessor)
{ }
// when a user belongs to multiple roles, IS4 returns a single claim with a serialised array of values
// this class improves the original factory by deserializing the claims in the correct way
public async override ValueTask<ClaimsPrincipal> CreateUserAsync(TAccount account, RemoteAuthenticationUserOptions options)
{
var user = await base.CreateUserAsync(account, options);
var claimsIdentity = (ClaimsIdentity)user.Identity;
if (account != null)
{
foreach (var kvp in account.AdditionalProperties)
{
var name = kvp.Key;
var value = kvp.Value;
if (value != null &&
(value is JsonElement element && element.ValueKind == JsonValueKind.Array))
{
claimsIdentity.RemoveClaim(claimsIdentity.FindFirst(kvp.Key));
var claims = element.EnumerateArray()
.Select(x => new Claim(kvp.Key, x.ToString()));
claimsIdentity.AddClaims(claims);
}
}
}
return user;
}
}
}
然后在您的程序/启动中注册它(取决于您是否使用 .core 托管),如下所示:
builder.Services.AddOidcAuthentication(options =>
{
builder.Configuration.Bind("oidc", options.ProviderOptions);
})
.AddAccountClaimsPrincipalFactory<ArrayClaimsPrincipalFactory<RemoteUserAccount>>();
关于identityserver4 - Blazor 级联 AuthorizeView 策略不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64968789/
我正在开发一个新项目,该项目将针对用户可以和不能访问/查看的内容制定一些深入的政策,使用 Identity Server 4。 我正在尝试使用 AuthorizeView 和策略来隐藏导航中的选项,但
我知道以下 Razor 代码适用于 AD 组。 但是,我需要从 json 文件授予权限。在 json 文件中,它定义了, { "WindowsUserName1" : [ "My own gr
我知道以下 Razor 代码适用于 AD 组。 但是,我需要从 json 文件授予权限。在 json 文件中,它定义了, { "WindowsUserName1" : [ "My own gr
我使用 Visual Studio 2019 创建了一个新的 Blazor 服务器端应用程序。我选择了 Windows 身份验证。 以下组件 (\BlazorApp1\BlazorApp1\Share
我是一名优秀的程序员,十分优秀!