我有一个Blazor服务器应用程序,我正在玩,以了解更多。我正在尝试解决授权问题。
我的应用程序集成了AzureAD和SSO。一旦我登录到浏览器会话,我就可以获得用户信息并填充他们的菜单。我限制了菜单只显示基于用户权限的项目,这是通过数据库查询和EF加载的。
我想了解的是如何使用AuthorizeView ect来检查当前页面对用户的"允许"。菜单项,看看他们是否应该在那里?
。防止用户复制页面/admin并将URL粘贴到浏览器中。我读了一些书,但不太明白,因为很多书都是关于"角色"的。我得到了authorizeview;和";Authorized"组件,但不确定如何覆盖它以查看当前页面是否"有效"。
我使用的是Blazor Server, net7.0 .
解决这个问题的一种方法是使用策略定义,然后用一个属性标记页面,授权它使用这些策略。你也可以使用AuthorizeView组件中的Policy属性来隐藏导航选项本身。
我将给出一个非常基本的示例,通过定义基于AAD扩展属性的策略来说明这将是什么样子,但是使用绑定到数据库的角色管理器的方法在概念上没有太大的不同——我将在这个示例之后发布一个链接,其中有一个示例。
下面的示例查看在AAD中定义的名为isVegetarian的扩展属性。它的目的是传达在高层次上使用基于策略的方法的思想,但是对于更复杂的角色集的特定实现在下面提供的链接中有更好的描述。
在你的Program.cs Main方法中,你要添加服务的地方,你可能会有这样的东西:
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("isVegetarian", policy => policy.RequireClaim("extension_isVegetarian", new[] { "true" }));
// By default, all incoming requests will be authorized according to the default policy
options.FallbackPolicy = options.DefaultPolicy;
});
通过向页面添加如下属性来控制页面访问:
@attribute [Authorize(Policy = "isVegetarian")]
或者在导航菜单中。razor,使用AuthorizeView组件中的Policy属性来包装菜单选项:
<AuthorizeView Policy="isVegetarian">
//link to vegetarian options
</AuthorizeView>
当然可以修改策略要求的条件。具体来说,您可能希望策略要求角色成员和/或其他特征(requierole, RequireUserName, requiresertion,等等)。
下面的链接更详细地描述了在Blazor中使用基于策略的授权:https://shauncurtis.github.io/articles/Policy-Based-Authorization.html