尝试将 AuthorizeView 视图组件构建到您的组件中是一种非常笨拙且容易出错的方法。它本身就是一个组件。要实现安全性,您需要退后一步并在AuthorizeView 中实现逻辑。
让我向您展示一个示例,我用它来演示您可以构建到库组件中的授权类型。这个基于用户传递定义的策略在列表行上隐藏/显示按钮,例如编辑按钮。
public class UIAuthorizeButton : UIButton
{
[CascadingParameter] public Task<AuthenticationState> AuthTask { get; set;
[Parameter] public string Policy { get; set; } = String.Empty;
[Parameter] public object? AuthFields { get; set; } = null;
} = default!;
[Inject] protected IAuthorizationService authorizationService { get; set; } =default!;
protected async override Task OnParametersSetAsync()
{
if (AuthTask is null)
throw new Exception($"{this.GetType().FullName} must have access to cascading Paramater {nameof(AuthTask)}");
await this.CheckPolicy();
}
protected virtual async ValueTask CheckPolicy()
{
var state = await AuthTask!;
var result = await this.authorizationService.AuthorizeAsync(state.User, AuthFields, Policy);
// code to hide the component if fails
}
}
按钮的东西并不重要。该组件使用策略并与IAuthorizationService 交互以验证当前用户是否通过了策略。
在这个例子中,AuthFields 是一个简单的对象,它包含来自记录中 OwnerId 字段的 Guid。定义了一个自定义策略,用于检查提供的 ID 与 ClaimsPrincipal 中通过 state.User 提供的用户 ID。
您可以在此处查看正在运行的按钮:https://blazr-demo.azurewebsites.net/weatherforecast/list。您可以在顶部栏中选择登录的用户。
请注意,提供所有支持这项工作的基础设施远远超出了 StackOverflow 答案的范围!
这有多大用处以及您可以实现多少取决于您在授权以及定义和构建授权策略方面的知识水平。
以下是您可能会发现有用的一些资源。
https://learn.microsoft.com/en-us/archive/msdn-magazine/2017/october/cutting-edge-policy-based-authorization-in-asp-net-core
https://learn.microsoft.com/en-us/dotnet/framework/wcf/extending/custom-authorization