跳到主要内容
给我们的新朋友:

Logto 是一个为现代应用和 SaaS 产品设计的 Auth0 替代方案。它提供 Cloud开源 服务,帮助你快速启动身份和管理 (IAM) 系统。享受认证 (Authentication)、授权 (Authorization) 和多租户管理 一体化

我们建议从 Logto Cloud 上的免费开发租户开始。这可以让你轻松探索所有功能。

在本文中,我们将介绍使用 .NET Core (Blazor Server)Logto 快速构建 Google 登录体验(用户认证 (Authentication))的步骤。

先决条件

在 Logto 中创建一个应用程序

Logto 基于 OpenID Connect (OIDC) 认证 (Authentication) 和 OAuth 2.0 授权 (Authorization)。它支持跨多个应用程序的联合身份管理,通常称为单点登录 (SSO)。

要创建你的 传统网页 应用程序,只需按照以下步骤操作:

  1. 打开 Logto Console。在“开始使用”部分,点击“查看全部”链接以打开应用程序框架列表。或者,你可以导航到 Logto Console > Applications,然后点击“创建应用程序”按钮。 开始使用
  2. 在打开的模态窗口中,点击“传统网页”部分,或使用左侧的快速过滤复选框过滤所有可用的“传统网页”框架。点击 ".Net Core (Blazor Server)" 框架卡片以开始创建你的应用程序。 框架
  3. 输入应用程序名称,例如“Bookstore”,然后点击“创建应用程序”。

🎉 太棒了!你刚刚在 Logto 中创建了你的第一个应用程序。你将看到一个祝贺页面,其中包含详细的集成指南。按照指南查看你的应用程序中的体验将会是什么样的。

集成 .Net Core (Blazor Server) SDK

提示:
  • 以下演示基于 .NET Core 8.0 构建。该 SDK 兼容 .NET 6.0 或更高版本。
  • .NET Core 示例项目可在 GitHub 仓库 中找到。

安装

将 NuGet 包添加到你的项目中:

dotnet add package Logto.AspNetCore.Authentication

添加 Logto 认证 (Authentication)

打开 Startup.cs(或 Program.cs)并添加以下代码以注册 Logto 认证服务:

Program.cs
using Logto.AspNetCore.Authentication;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddLogtoAuthentication(options =>
{
options.Endpoint = builder.Configuration["Logto:Endpoint"]!;
options.AppId = builder.Configuration["Logto:AppId"]!;
options.AppSecret = builder.Configuration["Logto:AppSecret"];
});

AddLogtoAuthentication 方法将执行以下操作:

  • 将默认认证方案设置为 LogtoDefaults.CookieScheme
  • 将默认挑战方案设置为 LogtoDefaults.AuthenticationScheme
  • 将默认注销方案设置为 LogtoDefaults.AuthenticationScheme
  • 将 cookie 和 OpenID Connect 认证处理程序添加到认证方案中。

登录 / 登出流程

在我们继续之前,需要澄清 .NET Core 认证中间件中的两个容易混淆的术语:

  1. CallbackPath:用户登录后,Logto 将用户重定向回来的 URI(在 Logto 中称为“重定向 URI”)
  2. RedirectUri:在 Logto 认证中间件中完成必要操作后,将重定向到的 URI。

登录过程可以如下图所示:


类似地,.NET Core 也有用于注销流程的 SignedOutCallbackPathRedirectUri

为了清晰起见,我们将它们称为:

我们使用的术语.NET Core 术语
Logto 重定向 URICallbackPath
Logto 注销后重定向 URISignedOutCallbackPath
应用程序重定向 URIRedirectUri

关于基于重定向的登录

  1. 此认证 (Authentication) 过程遵循 OpenID Connect (OIDC) 协议,Logto 强制执行严格的安全措施以保护用户登录。
  2. 如果你有多个应用程序,可以使用相同的身份提供商 (IdP)(日志 (Logto))。一旦用户登录到一个应用程序,当用户访问另一个应用程序时,Logto 将自动完成登录过程。

要了解有关基于重定向的登录的原理和好处的更多信息,请参阅 Logto 登录体验解释

配置重定向 URI

备注:

在以下代码片段中,我们假设你的应用程序运行在 http://localhost:3000/

首先,让我们配置 Logto 重定向 URI。将以下 URI 添加到 Logto 应用详情页面的“重定向 URI”列表中:

http://localhost:3000/Callback

要配置 Logto 签出后重定向 URI,请将以下 URI 添加到 Logto 应用详情页面的“签出后重定向 URI”列表中:

http://localhost:3000/SignedOutCallback

更改默认路径

Logto 重定向 URI 的默认路径是 /Callback,而 Logto 签出后重定向 URI 的默认路径是 /SignedOutCallback

如果没有特殊要求,你可以保持原样。如果你想更改它,可以为 LogtoOptions 设置 CallbackPathSignedOutCallbackPath 属性:

Program.cs
builder.Services.AddLogtoAuthentication(options =>
{
// 其他配置...
options.CallbackPath = "/Foo";
options.SignedOutCallbackPath = "/Bar";
});

记得在 Logto 应用详情页面中相应地更新值。

添加路由

由于 Blazor Server 使用 SignalR 在服务器和客户端之间进行通信,这意味着直接操作 HTTP 上下文的方法(如发起挑战或重定向)在从 Blazor 组件调用时无法按预期工作。

为了正确实现,我们需要显式添加两个用于登录和注销重定向的端点:

Program.cs
app.MapGet("/SignIn", async context =>
{
if (!(context.User?.Identity?.IsAuthenticated ?? false))
{
await context.ChallengeAsync(new AuthenticationProperties { RedirectUri = "/" });
} else {
context.Response.Redirect("/");
}
});

app.MapGet("/SignOut", async context =>
{
if (context.User?.Identity?.IsAuthenticated ?? false)
{
await context.SignOutAsync(new AuthenticationProperties { RedirectUri = "/" });
} else {
context.Response.Redirect("/");
}
});

现在我们可以重定向到这些端点以触发登录和注销。

实现登录 / 登出按钮

在 Razor 组件中,添加以下代码:

Components/Pages/Index.razor
@using Microsoft.AspNetCore.Components.Authorization
@using System.Security.Claims
@inject AuthenticationStateProvider AuthenticationStateProvider
@inject NavigationManager NavigationManager

@* ... *@

<p>是否认证 (Is authenticated): @User.Identity?.IsAuthenticated</p>
@if (User.Identity?.IsAuthenticated == true)
{
<button @onclick="SignOut">登出</button>
}
else
{
<button @onclick="SignIn">登录</button>
}

@* ... *@

@code {
private ClaimsPrincipal? User { get; set; }

protected override async Task OnInitializedAsync()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
User = authState.User;
}

private void SignIn()
{
NavigationManager.NavigateTo("/SignIn", forceLoad: true);
}

private void SignOut()
{
NavigationManager.NavigateTo("/SignOut", forceLoad: true);
}
}

说明

  • 注入的 AuthenticationStateProvider 用于获取当前用户的认证状态,并填充 User 属性。
  • SignInSignOut 方法用于分别将用户重定向到登录和登出端点。由于 Blazor Server 的特性,我们需要使用 NavigationManager 并强制加载以触发重定向。

如果用户未认证,页面将显示“登录”按钮;如果用户已认证,则显示“登出”按钮。

<AuthorizeView /> 组件

或者,你可以使用 AuthorizeView 组件根据用户的认证状态有条件地渲染内容。当你想向已认证和未认证用户显示不同内容时,这个组件非常有用。

在你的 Razor 组件中,添加以下代码:

Components/Pages/Index.razor
@using Microsoft.AspNetCore.Components.Authorization

@* ... *@

<AuthorizeView>
<Authorized>
<p>名称:@User?.Identity?.Name</p>
@* 已认证用户的内容 *@
</Authorized>
<NotAuthorized>
@* 未认证用户的内容 *@
</NotAuthorized>
</AuthorizeView>

@* ... *@

AuthorizeView 组件需要一个类型为 Task<AuthenticationState> 的级联参数。获取此参数的直接方法是添加 <CascadingAuthenticationState> 组件。然而,由于 Blazor Server 的特性,我们不能简单地将组件添加到布局或根组件(可能无法按预期工作)。相反,我们可以在构建器中添加以下代码(Program.csStartup.cs)来提供级联参数:

Program.cs
builder.Services.AddCascadingAuthenticationState();

然后你可以在每个需要的组件中使用 AuthorizeView 组件。

检查点:测试你的应用程序

现在,你可以测试你的应用程序:

  1. 运行你的应用程序,你将看到登录按钮。
  2. 点击登录按钮,SDK 将初始化登录过程并将你重定向到 Logto 登录页面。
  3. 登录后,你将被重定向回你的应用程序,并看到登出按钮。
  4. 点击登出按钮以清除令牌存储并登出。

添加 Google 连接器

要实现快速登录并提高用户转化率,请将 .Net Core (Blazor Server) 作为身份提供商 (IdP) 进行连接。Logto 社交连接器可以帮助你在几分钟内通过允许输入多个参数来建立此连接。

要添加社交连接器,只需按照以下步骤操作:

  1. 导航到 Console > Connectors > Social Connectors
  2. 点击“添加社交连接器”并选择“Google”。
  3. 按照 README 指南完成必填字段并自定义设置。

Connector tab

备注:

如果你正在按照现场连接器指南进行操作,可以跳过下一部分。

设置 Google OAuth 应用

在 Google API Console 中设置项目

  • 访问 Google API Console 并使用你的 Google 账户登录。
  • 点击顶部菜单栏的 选择项目 按钮,然后点击 新建项目 按钮创建一个项目。
  • 在你新创建的项目中,点击 API 和服务 进入 API 和服务 菜单。

配置并注册你的应用程序

  • 在左侧 API 和服务 菜单中,点击 OAuth 用户授权页面 按钮。
  • 选择你想要的 用户类型,然后点击 创建 按钮。(注意:如果你选择 外部 作为你的 用户类型,你将需要稍后添加测试用户。)

现在你将进入 编辑应用注册 页面。

编辑应用注册

  • 按照说明填写 OAuth 用户授权页面 表单。
  • 点击 保存并继续 以继续。

配置权限

  • 点击 添加或移除权限 并在弹出抽屉中选择 ../auth/userinfo.email../auth/userinfo.profileopenid,然后点击 更新 完成。建议你考虑添加所有可能使用的权限,否则某些你在配置中添加的权限可能无法正常工作。
  • 根据需要填写表单。
  • 点击 保存并继续 以继续。

添加测试用户(仅限外部用户类型)

  • 点击 添加用户 并添加测试用户,以允许这些用户在测试时访问你的应用程序。
  • 点击 保存并继续 以继续。

现在你应该已经配置好了 Google OAuth 2.0 用户授权页面。

获取 OAuth 2.0 凭据

  • 在左侧 API 和服务 菜单中,点击 凭据 按钮。
  • 凭据 页面,点击顶部菜单栏的 + 创建凭据 按钮,并选择 OAuth 客户端 ID
  • 创建 OAuth 客户端 ID 页面,选择 Web 应用程序 作为应用程序类型。
  • 填写你的应用程序的基本信息。
  • 点击 + 添加 URI 以在 授权的 JavaScript 来源 部分添加一个授权域名。这是你的 Logto 授权页面将从中提供服务的域名。在我们的例子中,这将是 ${your_logto_origin}。例如 https://logto.dev
  • 点击 + 添加 URI 在 **授权重定向 URI** 部分设置 **授权重定向 URI**,它将在用户登录后将其重定向到应用程序。在我们的例子中,这将是 ${your_logto_endpoint}/callback/${connector_id}。例如 https://logto.dev/callback/${connector_id}connector_id 可以在 Logto 管理控制台连接器详情页面的顶部栏找到。
  • 点击 创建 完成,然后你将获得 客户端 ID客户端密钥

配置你的连接器

使用你在前一节中从 OAuth 应用详情页面获得的 客户端 ID客户端密钥 填写 clientIdclientSecret 字段。

scope 是一个以空格分隔的 权限 列表。如果未提供,权限默认为 openid profile email

prompts 是一个字符串数组,指定所需的用户交互类型。字符串可以是以下值之一:

  • none:授权服务器不显示任何认证或用户授权页面;如果用户尚未认证并且未预先配置请求权限的授权,它将返回错误。你可以使用 none 来检查现有的认证和/或授权。
  • consent:授权服务器在向客户端返回信息之前提示用户进行授权。
  • select_account:授权服务器提示用户选择一个用户账户。这允许拥有多个账户的用户在授权服务器上选择他们可能有当前会话的多个账户之一。

配置类型

名称类型
clientIdstring
clientSecretstring
scopestring
promptsstring[]

启用 Google One Tap

Google One Tap 是一种安全且简单的方法,让用户使用他们的 Google 账户登录到你的网站或应用程序。

一旦你设置好了 Google 连接器,你将在连接器详情页面看到一个 Google One Tap 卡片。你可以通过切换开关在注册和登录页面启用 Google One Tap。

启用 Google One Tap 后,你可以配置以下选项:

  • 如果可能,自动选择凭据:如果满足 某些条件,自动使用 Google 账户登录用户。
  • 如果用户点击/点击外部,取消提示:如果用户点击或点击提示外部,关闭 Google One Tap 提示。如果禁用,用户必须点击关闭按钮以关闭提示。
  • 在 ITP 浏览器上启用升级的 One Tap UX:在智能跟踪预防 (ITP) 浏览器上启用升级的 Google One Tap 用户体验。请参考 此页面 了解更多信息。
备注:

要在你的网站上启用 Google One Tap(超出 Logto 登录体验),此功能正在开发中。请关注更新。

保存你的配置

仔细检查你是否在 Logto 连接器配置区域填写了必要的值。点击“保存并完成”(或“保存更改”),Google 连接器现在应该可用了。

在登录体验中启用 Google 连接器

一旦你成功创建了一个社交连接器,你可以在登录体验中将其启用为“继续使用 Google”按钮。

  1. 导航到 Console > 登录体验 > 注册和登录
  2. (可选)如果只需要社交登录,选择“无”作为注册标识符。
  3. 将配置好的 Google 连接器添加到“社交登录”部分。

登录体验选项卡

测试和验证

返回到你的 .NET Core (Blazor Server) 应用。你现在应该可以使用 Google 登录了。享受吧!

拓展阅读

终端用户流程:Logto 提供开箱即用的认证 (Authentication) 流程,包括多因素认证 (MFA) 和企业单点登录 (SSO),以及强大的 API,用于灵活实现账户设置、安全验证和多租户体验。

授权 (Authorization):授权 (Authorization) 定义了用户在被认证 (Authentication) 后可以执行的操作或访问的资源。探索如何保护你的 API 以用于原生和单页应用程序,并实现基于角色的访问控制 (RBAC)。

组织 (Organizations):在多租户 SaaS 和 B2B 应用中特别有效,组织功能支持租户创建、成员管理、组织级 RBAC 和即时供应。

客户 IAM 系列:我们关于客户(或消费者)身份和访问管理的系列博客文章,从 101 到高级主题及更深入的内容。