Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Authentication 如何根据用户是否登录启用/禁用元素?_Authentication_Blazor_Blazor Webassembly - Fatal编程技术网

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,显示了我的姓名,但这段代码声称我没有经过身份验证。在重新加载整个页面后,它会声明我是——所以双方都是同步的。现在的问题是,为什么在登录后它看不到我已登录(我将为它打开另一个问题)。