asp.net - 在 ASP.NET Blazor Web Assembly 客户端应用程序中使用 Auth0 注销后出现登录提示

标签 asp.net blazor auth0 blazor-client-side

我刚刚开始构建一个简单的 Web 程序集 ASP.NET 客户端 Web 应用程序,其身份验证由 Auth0 提供支持。

我发现有几篇文章可以引导您完成执行此操作所需的步骤,例如这篇文章:https://auth0.com/blog/what-is-blazor-tutorial-on-building-webapp-with-authentication/

不幸的是,由于其中许多已编写,Blazor 客户端项目似乎已从面向 .NET Core 移植到 .NET Standard,因此无法安装所需的 NuGet 包:Microsoft.AspNetCore。认证.OpenIdConnect

相反,我从 Microsoft 找到了一个使用 Microsoft.AspNetCore.Components.WebAssembly.Authentication 的教程,它包装了一些处理身份验证流程所需的 Javascript 代码: https://learn.microsoft.com/en-us/aspnet/core/security/blazor/webassembly/standalone-with-authentication-library?view=aspnetcore-3.1

我设法使其正常工作,但是当我注销并再次登录时,该应用程序会自动进行身份验证,而无需将我带到 Auth0 登录页面。根据OpenID Connect specification我需要发送一个可选的 prompt 参数设置为 login 以强制显示登录屏幕(注销后我作为用户所期望的)。

前面提到的 Microsoft.AspNetCore.Authentication.OpenIdConnect 库可以设置这个参数:https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.authentication.openidconnect.openidconnectoptions.prompt?view=aspnetcore-3.0

据我所知,WebAssembly 库没有:https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.components.webassembly.authentication.oidcprovideroptions?view=aspnetcore-3.1

有人知道解决方法吗?

我的Program.cs如下:

public class Program
    {
        public static async Task Main(string[] args)
        {
            var builder = WebAssemblyHostBuilder.CreateDefault(args);
            builder.RootComponents.Add<App>("app");

            builder.Services.AddTransient(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });

            builder.Services.AddOidcAuthentication(options =>
            {
                options.ProviderOptions.Authority = $"https://{builder.Configuration["Auth0:Domain"]}";
                options.ProviderOptions.ClientId = builder.Configuration["Auth0:ClientId"];
                options.ProviderOptions.ResponseType = builder.Configuration["Auth0:ResponseType"];
                options.ProviderOptions.PostLogoutRedirectUri = "/";
            });

            await builder.Build().RunAsync();
        }
    }

最佳答案

我发现我需要显式调用 logout 端点: https://auth0.com/docs/api/authentication?javascript#logout

现在我已经创建了一个 Logout 组件并在其中添加了逻辑 - 我希望有更好的方法(例如,将其配置为 AddOidcAuthentication 的一部分,但我不能'想不通)。

@inject NavigationManager Navigation
@inject SignOutSessionStateManager SignOutManager
@inject BaseAddress BaseAddress
@inject Auth0Config Auth0Config

<AuthorizeView>
    <Authorized>
        <button class=@($"{CssClass} btn btn-link") @onclick=BeginSignOut>Log out</button>
    </Authorized>
</AuthorizeView>

@code {
    
    [Parameter]
    public string CssClass { get; set; }

    private async Task BeginSignOut()
    {
        await SignOutManager.SetSignOutState();
        Navigation.NavigateTo($"{Auth0Config.Authority}/v2/logout?client_id={Auth0Config.ClientId}&returnTo={BaseAddress.Url}authentication/logout");
    }
}

关于asp.net - 在 ASP.NET Blazor Web Assembly 客户端应用程序中使用 Auth0 注销后出现登录提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61987616/

相关文章:

jquery - 下拉列表在 IE8 中变窄,向上打开

c# - 我想从 MySQL 数据库中检索去年的记录,但它正在从数据库中检索所有数据

asp.net-core - 未加载 Blazor 组件库中的 CSS

python - 将 Auth0 装饰器与 Flask-RESTful 资源一起使用

angular - 使用 angular-oauth2-oidc 库从 Auth0 获取完全访问 token

c# - Web 应用程序模块化设计实践

asp.net - EF 4.1异常 "The provider did not return a ProviderManifestToken string"

c# - Blazor WebAssembly 访问数据库

c# - Blazor 触发自定义验证消息

javascript - 如何使用 auth0-js WebAuth 识别新用户?