Repository navigation
问题目前 目前的行为类似: if (!await OnAuthorizing(path))
{
// 显示 NotAuthorized
NavigationManager.NavigateTo(NotAuthorizeUrl);
}
这对于使用 BootstrapBlazor 默认 Cookie 登录方式的项目没有问题。
但是对于已经有自己认证和权限体系的项目,这个行为会有冲突。
例如我的项目 EasyAdminBlazor 使用自己的认证和权限判断:
async Task<bool> OnAuthorizing(string path)
{
return await admin.AuthPath(path);
}
当用户已经登录,但是没有访问某个菜单的权限时:
OnAuthorizing
↓
return false
↓
NotAuthorized
我希望保留 NotAuthorized 的显示,同时保持当前 URL 不变。
但目前由于 NotAuthorizeUrl 会被直接导航,所以最终会跳转到:
/Account/Login
这实际上把“没有权限访问页面”和“没有登录”混在了一起。
建议
增加一个配置项,例如:
[Parameter]
public bool NavigateToNotAuthorizeUrl { get; set; } = true;
默认值保持 true,因此不会影响现有项目。
当设置为:
NavigateToNotAuthorizeUrl="false"
时:
- OnAuthorizing 返回 false
- NotAuthorized 正常显示
- 不自动导航到 NotAuthorizeUrl
- 保持当前 URL
也就是:
OnAuthorizing = false
↓
NotAuthorized
↓
不自动导航
而默认行为仍然是:
OnAuthorizing = false
↓
NotAuthorized
↓
NavigateTo(NotAuthorizeUrl)
为什么需要这个选项
OnAuthorizing = false 实际上可能代表两种不同情况:
1. 用户未登录,需要跳转登录页面
2. 用户已经登录,但没有权限访问当前页面
目前这两种情况都会触发 NotAuthorizeUrl。
如果能够单独控制是否自动导航,就可以让使用自定义认证/权限体系的项目继续使用 NotAuthorized,同时自行决定未授权后的处理方式。
感谢! |
Answered by
ArgoZhang
Oct 9, 2026
Replies: 4 comments 1 reply
|
@gudufy 非常感谢联系我们,并且提出了非常好的建议 增加如下参数 |
0 replies
|
感谢如此迅速的反应!在使用这个参数后又发现一个问题: 经过分析有可能是以下原因导致的,麻烦您再确认下。 原因就是 BootstrapBlazor 源码里是这样的: protected override async Task OnInitializedAsync()
{
...
_authenticated = await context.Handler.IsAuthorizedAsync(...);
if (OnAuthorizing != null)
{
_authenticated = _authenticated && await OnAuthorizing(Navigation.Uri);
}
}初始化时会把 所以地址栏直接访问无权限页面时: 因为源码明确是: @if (_authenticated)
{
...
}
else if (NotAuthorized != null)
{
@NotAuthorized
}所以能显示你的“无权限访问”。 但点击菜单完全不同菜单点击以后,BootstrapBlazor 走的是: private void Navigation_LocationChanged(object? sender, LocationChangedEventArgs e)
{
if (OnAuthorizing != null)
{
InvokeAsync(async () =>
{
var auth = await OnAuthorizing(e.Location);
if (!auth)
{
Navigation.NavigateTo(NotAuthorizeUrl, true);
}
});
}
}关键就在这里: var auth = await OnAuthorizing(e.Location);拿到了 _authenticated = auth;没有。 所以你现在把: 加进去以后: 也就是说:
|
0 replies
|
@gudufy 感谢反馈测试结果,我已经更新了逻辑。发布了新包 |
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@gudufy 发了新包
11.0.1-beta01试试看