Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.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
C# 通知所有组件Blazor中的身份验证已更改_C#_Asp.net Core_Authentication_Blazor_Blazor Webassembly - Fatal编程技术网

C# 通知所有组件Blazor中的身份验证已更改

C# 通知所有组件Blazor中的身份验证已更改,c#,asp.net-core,authentication,blazor,blazor-webassembly,C#,Asp.net Core,Authentication,Blazor,Blazor Webassembly,我有一个Blazor(版本net5.0)组件,其中有很多html标记,下面是其中的一部分: <a class="@(IsAuthenticated?"":"hide")" href="#">My link for logged in users</a> 但是在登录之后,除非我刷新页面,使组件重新加载,否则不会应用对MyComponent的任何更改 注意:我不想使用AuthorizeView,

我有一个Blazor(版本
net5.0
)组件,其中有很多
html
标记,下面是其中的一部分:

<a class="@(IsAuthenticated?"":"hide")" href="#">My link for logged in users</a>
但是在登录之后,除非我刷新页面,使组件重新加载,否则不会应用对MyComponent的任何更改

注意:我不想使用
AuthorizeView
,因为正如我所提到的,MyComponent中有很多标记和组件,我不想让
AuthorizeView
用于我希望根据用户身份验证更改其行为的每个样式或元素

更新:我的
App.razor
组件中有以下代码:

<Router AppAssembly="@typeof(Program).Assembly">
    <Found Context="routeData">
        <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(Layout)" >
            <Authorizing>
                <text> my Custom Authotizing in app.razor ...</text>
            </Authorizing> 
            <NotAuthorized>
                <text> my Custom NOT Authotized in app.razor ...</text>
            </NotAuthorized>
        </AuthorizeRouteView>
    </Found>
    <NotFound>
        <CascadingAuthenticationState>
            <LayoutView Layout="@typeof(Layout)">
                <p>Sorry, there's nothing at this address.</p>
            </LayoutView>
        </CascadingAuthenticationState>
    </NotFound>
</Router>

我在app.razor中的自定义授权。。。
我的自定义未在app.razor中授权。。。
对不起,这个地址什么也没有


查看
AuthorizedView
源代码,我终于明白我应该使用
OnParametersSetAsync
和一个属性:

<a class="@MyClassProp" href="#">My link for logged in users</a>

代码:

公共字符串MyClassProp{get;set;}=“hide”; 公共异步任务GetClassAsync()=>(等待身份验证状态)。User.Identity.IsAuthenticated?“”:“隐藏”; 受保护的异步重写任务OnParametersSetAsync() { MyClassProp=await GetClassAsync();//也在OnInitializedAsync中调用GetClass StateHasChanged(); 等待base.OnParametersSetAsync(); } 问题中创建的
IsAuthenticated
属性始终等于其初始状态,并且不会随着
AuthenticationState
的更改而更改,即使我在
OnParametersSetAsync
中重置其值。不需要在登录和注销方法中调用
StateHasChanged()
。如果我没有使用
MyClassProp
属性,而是从标记调用
GetClassAsync
,那么它也不起作用


警告:通过为未经授权的用户设置
css
类来隐藏元素的整个方法都存在安全问题,因为内容仍然可以被用户公开或修改,甚至只需使用他们的浏览器。

查看
AuthorizedView
源代码,我最终发现我应该使用
OnParametersSetAsync
和一个属性:

<a class="@MyClassProp" href="#">My link for logged in users</a>

代码:

公共字符串MyClassProp{get;set;}=“hide”; 公共异步任务GetClassAsync()=>(等待身份验证状态)。User.Identity.IsAuthenticated?“”:“隐藏”; 受保护的异步重写任务OnParametersSetAsync() { MyClassProp=await GetClassAsync();//也在OnInitializedAsync中调用GetClass StateHasChanged(); 等待base.OnParametersSetAsync(); } 问题中创建的
IsAuthenticated
属性始终等于其初始状态,并且不会随着
AuthenticationState
的更改而更改,即使我在
OnParametersSetAsync
中重置其值。不需要在登录和注销方法中调用
StateHasChanged()
。如果我没有使用
MyClassProp
属性,而是从标记调用
GetClassAsync
,那么它也不起作用


警告:通过为未经授权的用户设置
css
类来隐藏元素的整个方法都存在安全问题,因为即使用户仅使用浏览器,内容仍然可以被暴露或修改。

另一个不允许使用Blazor标记的示例。OP应该说明他是什么口味的Blazorusing@enet独立的WebAssembly,没有host@enet我不使用OIDC或IdentityServer4。我认为当用户进行身份验证时(无论如何),应该通知组件。@enet谢谢。我使用Jwt令牌身份验证。而且效果很好。AuthorizeView也可以正常工作。@不,我没有解决这个问题,我只是说我的代码的其他部分没有问题。另一个例子是为什么不能使用Blazor标记。OP应该说明他是什么口味的Blazorusing@enet独立的WebAssembly,没有host@enet我不使用OIDC或IdentityServer4。我认为当用户进行身份验证时(无论如何),应该通知组件。@enet谢谢。我使用Jwt令牌身份验证。而且效果很好。AuthorizeView也可以正常工作。@不,我没有解决问题,我只是说我的代码的其他部分没有问题
<a class="@MyClassProp" href="#">My link for logged in users</a>
public string MyClassProp { get; set; } = "hide";
public async Task<string> GetClassAsync()=> (await authenticationState).User.Identity.IsAuthenticated ? "" : "hide";
    
protected async override Task OnParametersSetAsync()
{
    MyClassProp = await GetClassAsync(); // also call GetClass in OnInitializedAsync
    StateHasChanged();
    await base.OnParametersSetAsync();
}