如何根据用户是不是登录启用/禁用元素?

Posted

技术标签:

【中文标题】如何根据用户是不是登录启用/禁用元素?【英文标题】:How to enable/disable elements depending whether the user is logged in or not?如何根据用户是否登录启用/禁用元素? 【发布时间】:2021-04-23 18:32:16 【问题描述】:

在到目前为止的所有示例中,我看到了如何显示完全不同视图的示例——一个用于用户登录的情况,另一个用于用户未登录的情况。

我想显示相同的元素,只是根据用户是否登录启用/禁用一些元素。我虽然可以阅读 context.User.Identity.IsAuthenticated 并像这样使用它:

<NavLink class="nav-link" href="foobar" 
  IsDisabled="@(!(context.User.Identity?.IsAuthenticated ?? false))">
  ...
</NavLink>

但这需要context。此属性由AuthorizeView 提供,而此组件反过来强制执行上述两组视图之间的严格分割。

那么如何实现只用单一的通用视图启用/禁用呢?

我完全知道这不是任何形式的安全措施。

更新 两个答案都具有相同的效果(再次感谢您),但有一点需要注意 - 就在登录这两种方法后,仍然返回信息用户未通过身份验证。以下是后续问题:How to get fresh information whether the user is logged in?

【问题讨论】:

【参考方案1】:

您可以通过定义Task&lt;AuthenticationState&gt;类型的级联参数来获取认证状态数据

这是来自文档的完整示例:

@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.";
        
    

注意:CascadingAuthenticationState 组件是向相关方公开身份验证状态的组件...

【讨论】:

非常感谢。仅作记录,目前此代码无法按预期对我工作-登录 LoginDisplay 组件后显示我已登录 id,显示我的姓名,但此代码声称我未通过身份验证。重新加载整个页面后,它表明我是 - 所以双方是同步的。现在的问题是为什么它在登录后看不到我已登录(我将为它打开另一个问题)。【参考方案2】:

您应该可以为此使用AuthenticationStateProvider。在官方docs 中有一个示例如何做到这一点。

【讨论】:

以上是关于如何根据用户是不是登录启用/禁用元素?的主要内容,如果未能解决你的问题,请参考以下文章

启用和禁用一个组件/HTML 中的所有元素

如何根据带有闪亮元素的 R Markdown 文档中的条件禁用按钮?

如何根据某人是不是使用 AngularJS 登录来隐藏和显示导航栏元素?

禁用输入选项卡

使用 Javascript 启用/禁用 iPhone Safari 的缩放?

延迟禁用元素? [关闭]