Blazor Webassembly 认证事件
Blazor Webassembly Authenticated Event
当使用 Microsoft.AspNetCore.Components.WebAssembly.Authentication 对用户进行身份验证时,在托管在 ASP.NET Core(最新的 blazor)上的客户端应用程序的 Blazor Webassembly 应用程序中,when/how 调用操作每次用户都经过身份验证?即使他们返回应用程序并进行了活动会话。
2020-07-15 更新:
我试图克服的问题是,一旦用户登录 (MSAL) 以获取他们的信息和个人资料图片,我们就有一项服务会转到 Graph API。在他们登录后,我使用 RemoteAuthenticatorView.OnLogInSucceeded 事件来了解他们实际登录的时间。问题是,如果他们随后刷新页面 (F5),该服务会丢失图形信息。我想我实际上想要实现的是保留会话数据。
我完全确定“每次他们都经过身份验证”是什么意思。
如果您想对每个事件(如页面加载)采取行动,那么您可以通过在页面中嵌入 AuthorizedView 来实现:
<AuthorizeView>
<Authorized>
... do action for authorized users ...
</Authorized>
<NotAuthorized>
... do action for un-authorized users ...
</NotAuthorized>
</AuthorizeView>
如果您想在执行身份验证操作时触发操作,您可以在 OnParametersSet 中执行此操作并查看操作以了解它是什么类型的身份验证事件。
为特定的 Actions 创建自定义 RenderFragments 可能更好 - 我猜这将取决于你想做什么。
@page "/authentication/{action}"
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@using Microsoft.AspNetCore.Components.WebAssembly.Hosting
@using System.Text.Json
@using System.Security.Claims
<RemoteAuthenticatorView Action="@Action" />
@inject ILogger<Authentication> logger
@code{
[Parameter]
public string Action { get; set; }
protected override void OnParametersSet()
{
base.OnParametersSet();
logger.LogInformation($"Action: {Action}");
//
// DO YOUR ACTION HERE
//
}
}
为了克服这个问题,我目前采用的解决方法是使用 LoginDisplay 组件的 razor 中的 Authorized 部分,触发服务检查服务用户信息是否为空,然后再次转到 Graph 而不是尝试存储在 localstorage 或类似的东西中......然后,我有显示组件的用户信息订阅服务中的事件以了解何时需要更新用户信息以调用 StateHasChanged()。
如果有更好的跨页面刷新持久化服务数据的方案,我满怀期待
解决这个问题的一种方法是制作一个包装您的应用程序的组件,并检查用户是否在 OnInitialized() 中进行了身份验证。结合订阅 AuthenticationStateProvider.AuthenticationStateChanged 对我有用。我发布了更详细的解决方案。
当使用 Microsoft.AspNetCore.Components.WebAssembly.Authentication 对用户进行身份验证时,在托管在 ASP.NET Core(最新的 blazor)上的客户端应用程序的 Blazor Webassembly 应用程序中,when/how 调用操作每次用户都经过身份验证?即使他们返回应用程序并进行了活动会话。
2020-07-15 更新: 我试图克服的问题是,一旦用户登录 (MSAL) 以获取他们的信息和个人资料图片,我们就有一项服务会转到 Graph API。在他们登录后,我使用 RemoteAuthenticatorView.OnLogInSucceeded 事件来了解他们实际登录的时间。问题是,如果他们随后刷新页面 (F5),该服务会丢失图形信息。我想我实际上想要实现的是保留会话数据。
我完全确定“每次他们都经过身份验证”是什么意思。
如果您想对每个事件(如页面加载)采取行动,那么您可以通过在页面中嵌入 AuthorizedView 来实现:
<AuthorizeView>
<Authorized>
... do action for authorized users ...
</Authorized>
<NotAuthorized>
... do action for un-authorized users ...
</NotAuthorized>
</AuthorizeView>
如果您想在执行身份验证操作时触发操作,您可以在 OnParametersSet 中执行此操作并查看操作以了解它是什么类型的身份验证事件。
为特定的 Actions 创建自定义 RenderFragments 可能更好 - 我猜这将取决于你想做什么。
@page "/authentication/{action}"
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@using Microsoft.AspNetCore.Components.WebAssembly.Hosting
@using System.Text.Json
@using System.Security.Claims
<RemoteAuthenticatorView Action="@Action" />
@inject ILogger<Authentication> logger
@code{
[Parameter]
public string Action { get; set; }
protected override void OnParametersSet()
{
base.OnParametersSet();
logger.LogInformation($"Action: {Action}");
//
// DO YOUR ACTION HERE
//
}
}
为了克服这个问题,我目前采用的解决方法是使用 LoginDisplay 组件的 razor 中的 Authorized 部分,触发服务检查服务用户信息是否为空,然后再次转到 Graph 而不是尝试存储在 localstorage 或类似的东西中......然后,我有显示组件的用户信息订阅服务中的事件以了解何时需要更新用户信息以调用 StateHasChanged()。
如果有更好的跨页面刷新持久化服务数据的方案,我满怀期待
解决这个问题的一种方法是制作一个包装您的应用程序的组件,并检查用户是否在 OnInitialized() 中进行了身份验证。结合订阅 AuthenticationStateProvider.AuthenticationStateChanged 对我有用。我发布了更详细的解决方案