C# 通知所有组件Blazor中的身份验证已更改
我有一个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,
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();
}