Authentication 如何根据用户是否登录启用/禁用元素?
在迄今为止的所有示例中,我都看到了如何显示完全不同的视图的示例——一个用于用户登录时的视图,另一个用于用户未登录时的视图 我想显示相同的元素,只是根据用户是否登录启用/禁用一些元素。我想我可以继续阅读Authentication 如何根据用户是否登录启用/禁用元素?,authentication,blazor,blazor-webassembly,Authentication,Blazor,Blazor Webassembly,在迄今为止的所有示例中,我都看到了如何显示完全不同的视图的示例——一个用于用户登录时的视图,另一个用于用户未登录时的视图 我想显示相同的元素,只是根据用户是否登录启用/禁用一些元素。我想我可以继续阅读context.User.Identity.IsAuthenticated,并像这样使用它: <NavLink class="nav-link" href="foobar" IsDisabled="@(!(context.User.Ide
context.User.Identity.IsAuthenticated
,并像这样使用它:
<NavLink class="nav-link" href="foobar"
IsDisabled="@(!(context.User.Identity?.IsAuthenticated ?? false))">
...
</NavLink>
...
但这需要上下文
。此属性由AuthorizeView
提供,此组件反过来在两组视图之间强制执行上述严格拆分
那么,如何仅使用单个公共视图实现启用/禁用呢
我完全知道这不是任何形式的安全措施
更新两个答案的效果相同(再次感谢您),但有一点小小的警告——在登录两个方法之后,仍然返回用户未经身份验证的信息。下面是后续问题:您应该能够使用
AuthenticationStateProvider
来实现这一点。在官方网站中,有一个示例说明了如何执行此操作。您应该能够使用AuthenticationStateProvider
进行此操作。在official中,有一个如何执行的示例。您可以通过定义类型为Task
以下是文档中的完整示例:
@page "/"
<button @onclick="LogUsername">Log username</button>
<p>@_authMessage</p>
@code {
[CascadingParameter]
private Task<AuthenticationState> authenticationStateTask { get; set; }
private string _authMessage;
private async Task LogUsername()
{
var authState = await authenticationStateTask;
var user = authState.User;
if (user.Identity.IsAuthenticated)
{
_authMessage = $"{user.Identity.Name} is authenticated.";
}
else
{
_authMessage = "The user is NOT authenticated.";
}
}
}
@page/“
日志用户名
@_authMessage
@代码{
[CascadingParameter]
私有任务authenticationStateTask{get;set;}
私有字符串authMessage;
专用异步任务LogUsername()
{
var authState=等待authenticationStateTask;
var user=authState.user;
if(user.Identity.IsAuthenticated)
{
_authMessage=$“{user.Identity.Name}已通过身份验证。”;
}
其他的
{
_authMessage=“用户未通过身份验证。”;
}
}
}
注意:
CascadingAuthenticationState
组件是向相关方公开身份验证状态的组件…您可以通过定义类型为Task
以下是文档中的完整示例:
@page "/"
<button @onclick="LogUsername">Log username</button>
<p>@_authMessage</p>
@code {
[CascadingParameter]
private Task<AuthenticationState> authenticationStateTask { get; set; }
private string _authMessage;
private async Task LogUsername()
{
var authState = await authenticationStateTask;
var user = authState.User;
if (user.Identity.IsAuthenticated)
{
_authMessage = $"{user.Identity.Name} is authenticated.";
}
else
{
_authMessage = "The user is NOT authenticated.";
}
}
}
@page/“
日志用户名
@_authMessage
@代码{
[CascadingParameter]
私有任务authenticationStateTask{get;set;}
私有字符串authMessage;
专用异步任务LogUsername()
{
var authState=等待authenticationStateTask;
var user=authState.user;
if(user.Identity.IsAuthenticated)
{
_authMessage=$“{user.Identity.Name}已通过身份验证。”;
}
其他的
{
_authMessage=“用户未通过身份验证。”;
}
}
}
注意:
CascadingAuthenticationState
组件是向相关方公开身份验证状态的组件…非常感谢。仅供记录,目前这段代码并不像预期的那样适用于我——在登录LoginDisplay组件后,显示了我的登录id,显示了我的姓名,但这段代码声称我没有经过身份验证。在重新加载整个页面后,它会声明我是——所以双方都是同步的。现在的问题是,为什么它看不到我登录后,登录(我会为它打开另一个问题)。非常感谢。仅供记录,目前这段代码并不像预期的那样适用于我——在登录LoginDisplay组件后,显示了我的登录id,显示了我的姓名,但这段代码声称我没有经过身份验证。在重新加载整个页面后,它会声明我是——所以双方都是同步的。现在的问题是,为什么在登录后它看不到我已登录(我将为它打开另一个问题)。