Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
Asp.net core Blazor Webassembly身份验证事件_Asp.net Core_Microsoft Graph Api_Msal_Blazor Client Side - Fatal编程技术网

Asp.net core Blazor Webassembly身份验证事件

Asp.net core Blazor Webassembly身份验证事件,asp.net-core,microsoft-graph-api,msal,blazor-client-side,Asp.net Core,Microsoft Graph Api,Msal,Blazor Client Side,使用Microsoft.AspNetCore.Components.WebAssembly.Authentication对用户进行身份验证时,在ASP.NET Core(最新版本,Blazor)上托管的客户端应用程序上的Blazor WebAssembly应用程序中,何时/如何在每次对用户进行身份验证时调用操作?即使他们返回应用程序并有一个活动会话 更新2020-07-15: 我试图克服的问题是,我们有一个服务,一旦用户登录(MSAL)以获取其信息和配置文件图像,它就会转到Graph API。在

使用Microsoft.AspNetCore.Components.WebAssembly.Authentication对用户进行身份验证时,在ASP.NET Core(最新版本,Blazor)上托管的客户端应用程序上的Blazor WebAssembly应用程序中,何时/如何在每次对用户进行身份验证时调用操作?即使他们返回应用程序并有一个活动会话

更新2020-07-15:
我试图克服的问题是,我们有一个服务,一旦用户登录(MSAL)以获取其信息和配置文件图像,它就会转到Graph API。在他们登录后,我使用RemoteAuthenticatorView.onLoginSucseed事件来了解他们实际登录的时间。问题是,如果他们随后刷新页面(F5),服务将丢失图形信息。我想我实际上想要实现的是持久化会话数据。

我完全明白你所说的“每次它们都经过身份验证”是什么意思

如果要对每个事件(如页面加载)执行操作,则可以通过在页面中嵌入AuthorizedView来实现:

<AuthorizeView>
    <Authorized>
        ... do action for authorized users ...
    </Authorized>
    <NotAuthorized>
        ... do action for un-authorized users ...
    </NotAuthorized>
</AuthorizeView>

为特定的动作创建自定义的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
        //
    }
}
@page”/authentication/{action}
@使用Microsoft.AspNetCore.Components.WebAssembly.Authentication
@使用Microsoft.AspNetCore.Components.WebAssembly.Hosting
@使用System.Text.Json
@使用System.Security.Claims
@ILogger记录器
@代码{
[参数]
公共字符串操作{get;set;}
受保护的覆盖无效OnParametersSet()
{
base.OnParametersSet();
logger.LogInformation($“Action:{Action}”);
//
//你在这里做什么
//
}
}

为了克服这一问题,到目前为止,我已经解决了使用LoginDisplay组件razor中的Authorized部分的解决方案,以触发服务检查服务用户信息是否为空,然后再次转到Graph,而不是尝试存储在localstorage或类似的东西中。。。然后,我让显示用户信息的组件订阅服务中的事件,以了解何时需要更新用户信息以调用StateHasChanged()


如果有更好的解决方案跨页面刷新持久化服务数据,我会全神贯注。

解决这个问题的一个方法是制作一个封装应用程序的组件,并检查用户是否在OnInitialized()中经过身份验证。再加上订阅AuthenticationStateProvider.AuthenticationStateChanged对我来说很有效。我发布了一个更详细的解决方案。

谢谢你的意见,杰夫。如果我尝试您的建议使用OnParameterSet,它不会在页面刷新(F5)实际发生时被触发。我终于克服了这个问题,我将用迄今为止的答案更新我的问题。