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

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

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

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

先决条件

在 Logto 中创建一个应用程序

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

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

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

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

集成 Logto 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 应用详情页面中相应地更新值。

实现登录 / 登出按钮

首先,将处理程序方法添加到你的 PageModel 中,例如:

Pages/Index.cshtml.cs
public class IndexModel : PageModel
{
public async Task OnPostSignInAsync()
{
await HttpContext.ChallengeAsync(new AuthenticationProperties
{
RedirectUri = "/"
});
}

public async Task OnPostSignOutAsync()
{
await HttpContext.SignOutAsync(new AuthenticationProperties
{
RedirectUri = "/"
});
}
}

然后,将按钮添加到你的 Razor 页面:

Pages/Index.cshtml
<p>是否已认证:@User.Identity?.IsAuthenticated</p>
<form method="post">
@if (User.Identity?.IsAuthenticated == true) {
<button type="submit" asp-page-handler="SignOut">登出</button>
} else {
<button type="submit" asp-page-handler="SignIn">登录</button>
}
</form>

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

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

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

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

添加 SendGrid 连接器

Email 连接器是一种用于发送一次性密码 (OTP) 的方法,用于认证 (Authentication)。它支持 电子邮件地址 验证,以支持无密码认证 (Authentication),包括基于 Email 的注册、登录、双因素认证 (2FA) 和账户恢复。 你可以轻松地将 SendGrid 连接为你的 Email 提供商。使用 Logto Email 连接器,你可以在几分钟内完成设置。

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

  1. 导航到 Console > Connector > Email and SMS connectors
  2. 要添加新的 Email 连接器,点击“设置”按钮并选择“SendGrid”。
  3. 查看你选择的提供商的 README 文档。
  4. 在“参数配置”部分完成配置字段。
  5. 使用 JSON 编辑器自定义 Email 模板。
  6. 通过向你的 电子邮件地址 发送验证码来测试你的配置。

Connector tab

备注:

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

设置 SendGrid email 连接器

注册 SendGrid 账户

SendGrid 网站创建一个新账户。如果你已经有账户,可以跳过此步骤。

验证发件人

前往 SendGrid 控制台页面并使用你的 SendGrid 账户登录。

发件人表示我们将从哪个地址发送验证码邮件。为了通过 SendGrid 邮件服务器发送邮件,你需要至少验证一个发件人。

SendGrid 控制台页面开始,进入侧边栏的“Settings” -> “Sender Authentication”。

推荐进行域认证,但不是强制的。你可以点击“Authenticate Your Domain”卡片中的“Get started”,并按照接下来的指南将发件人链接并验证到 SendGrid。

通过点击面板中的“Verify a Single Sender”按钮,你现在需要填写一些关键信息来创建一个发件人。按照指南填写所有这些字段,然后点击“Create”按钮。

创建单个发件人后,会向你的发件人邮箱地址发送一封带有验证链接的邮件。进入你的邮箱,找到验证邮件,并通过点击邮件中提供的链接完成单个发件人的验证。现在,你可以使用刚刚验证的发件人通过 SendGrid 连接器发送邮件。

创建 API 密钥

SendGrid 控制台页面开始,进入侧边栏的“Settings” -> “API Keys”。

点击 API Keys 页面右上角的“Create API Key”。输入 API 密钥的名称,并根据你的使用场景自定义“API Key Permission”。在使用此 API 密钥发送邮件之前,需要全局 Full AccessRestricted Access 并对 Mail Send 具有完全访问权限。

在完成 Create API Key 过程后,API 密钥会显示在屏幕上。你应该将此 API 密钥保存在安全的地方,因为这是你唯一能看到它的机会。

配置你的连接器

在“创建 API 密钥”部分中创建的 API Key 填写到 apiKey 字段中。

fromEmailfromName 字段中填写发件人的 From AddressNickname。你可以在 "Sender Management" 页面找到发件人的详细信息。fromName 是可选的,所以你可以跳过填写。

你可以为不同的情况添加多个 SendGrid 邮件连接器模板。以下是添加单个模板的示例:

  • 填写 subject 字段,作为邮件的标题。
  • 用任意字符串类型的内容填写 content 字段。不要忘记保留 {{code}} 占位符用于随机验证码。
  • 根据不同的使用场景填写 usageType 字段,可以是 RegisterSignInForgotPasswordGeneric
  • 根据不同的内容类型填写 type 字段,可以是 text/plaintext/html

为了启用完整的用户流程,需要使用 RegisterSignInForgotPasswordGeneric 的模板。

以下是 SendGrid 连接器模板 JSON 的示例。

[
{
"subject": "<register-template-subject>",
"content": "<Logto: Your verification code is {{code}}. (register template)>",
"usageType": "Register",
"type": "text/plain",
},
{
"subject": "<sign-in-template-subject>",
"content": "<Logto: Your verification code is {{code}}. (sign-in template)>",
"usageType": "SignIn",
"type": "text/plain",
},
{
"subject": "<forgot-password-template-subject>",
"content": "<Logto: Your verification code is {{code}}. (forgot-password template)>",
"usageType": "ForgotPassword",
"type": "text/plain",
},
{
"subject": "<generic-template-subject>",
"content": "<Logto: Your verification code is {{code}}. (generic template)>",
"usageType": "Generic",
"type": "text/plain",
},
]

测试 SendGrid 邮件连接器

你可以输入一个电子邮件地址并点击“Send”来查看设置是否可以在“Save and Done”之前工作。

就是这样。不要忘记 在登录体验中启用连接器

配置类型

名称类型
apiKeystring
fromEmailstring
fromNamestring (可选)
templatesTemplate[]
模板属性类型枚举值
subjectstringN/A
contentstringN/A
usageTypeenum string'Register' | 'SignIn' | 'ForgotPassword' | 'Generic'
typeenum string'text/plain' | 'text/html'

保存你的配置

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

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

一旦你成功创建了一个 连接器,你就可以启用基于手机号的无密码登录和注册。

  1. 导航到 Console > 登录体验 > 注册和登录
  2. 设置注册方法(可选):
    1. 选择“电子邮件地址”或“电子邮件或手机号”作为注册标识符。
    2. “注册时验证”被强制启用。你还可以在注册时启用“创建密码”。
  3. 设置登录方法:
    1. 选择 电子邮件地址 作为登录标识符之一。你可以提供多个可用的标识符(电子邮件、手机号和用户名)。
    2. 选择“验证码”和 / 或“密码”作为认证 (Authentication) 因素。
  4. 点击“保存更改”并在“实时预览”中测试。

登录体验选项卡

除了通过 一次性密码进行注册和登录外,你还可以启用密码恢复和基于 的安全验证,以及将 电子邮件地址 关联到个人资料。有关更多详细信息,请参阅 终端用户流程

测试和验证

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

进一步阅读

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

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

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

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