安全
本文内容
本文简要介绍如何在 SnapDevelop 中配置应用程序认证和授权。
概述
您可以右键点击设计器项目,然后选择 安全 菜单,在 安全 选项卡上启用身份验证和授权。
对于身份验证,当前您可以选择使用 JWT 内部认证、JWT 外部认证、或者 API Key 认证。
- JWT 内部认证:内置 Token 生成与验证机制,需配置登录和获取用户信息 API。适合应用内快速启用身份验证。
- JWT 外部认证:依赖外部认证服务(如 Azure AD),需绑定外部提供的登录与用户信息 API。适合企业己有统一认证中心,复用外部认证服务。
- API Key:使用固定的 Key 进行验证,简单易用,但安全性依赖传输层(HTTPS)保护。适合测试环境或无需复杂认证的外部 API。
对于授权,您可以选择使用默认策略(JWT授权策略)或匿名策略。在启用授权后,所有 API 都会自动使用默认策略,您可以在 API 设置页面中为每个 API 选择不同的授权策略。
身份验证
1. JWT 内部认证
当选择 内部 模式,并将 认证方式 设置为 JWT 时,系统会使用系统内置的 JWT 认证机制来进行身份验证。
-
登录 API 指定用户登录接口,例如 Login,用于验证用户名和密码并生成 JWT Token。
-
获取用户信息 API 指定一个接口,例如 GetUserInfo,用于在验证 Token 后返回用户信息。
-
算法 支持选择如
HS256、HS384、HS512等常见 JWT 签名算法。 -
密钥
用于签发和验证 Token 的密钥,可以随机生成。
原始:密钥的二进制形式,适用于内部计算机系统处理。
Base64 编码:将二进制密钥转换为文本格式,便于通过文本协议传输或存储。
-
过期时间
设置 Token 的有效期,例如2小时。
-
添加位置
请求头 请求头名称:指定哪个字段用于传递特定信息,默认值为 Authorization。 请求头前缀:附加在字段值前的标识符,默认值为 Bearer。
查询参数 查询参数名称:URL 中 ? 后面的参数名,通常用于在 GET 请求中传递数据。

2. JWT 外部认证
当选择 外部 模式,并将 认证方式 设置为 JWT 时,系统不会内置管理登录和用户信息接口,而是通过第三方或外部服务来处理用户认证。
-
登录 API 指定外部提供的用户登录接口。系统会调用这个接口来生成 Token。
-
获取用户信息 API 指定外部提供的接口,用于验证 Token 并获取用户信息。
与内部模式类似,可以配置 Token 的传递方式(请求头或查询参数)。
使用场景
- 适合企业己有统一认证中心(如 Microsoft Entra ID/Azure AD)的情况。
- 允许 PowerServer 复用现有的外部身份认证服务。

3. API Key 认证
当选择 外部 模式,并将 认证方式 设置为 API Key 时,系统通过在请求中传递固定的键值对来进行身份验证。
-
键
指定 API Key 的字段名称,默认值为 X-API-Key,可自定义。
-
值 配置 API Key 的具体值。客户端必须在请求中提供相同的值。
-
添加位置
将API Key放在请求头(请求的HTTP头部,以保证请求安全)或者查询参数(URL的查询参数,便于在GET请求中传递)。
使用场景
- 快速接入和测试。
- 适合无需复杂认证流程的外部 API。
- 建议在生产环境中始终配合 HTTPS,以防止 Key 泄露。

启用身份验证后,系统会自动创建以下视图文件,用来实现与身份验证相关的界面和逻辑:
- Login.sdv:该文件用于实现用户登录界面,用户在此界面输入他们的凭据(如用户名和密码),并提交以进行身份验证。
- Register.sdv:该文件用于用户注册界面,允许新用户创建一个帐户,输入必要的注册信息,并提交到服务器。
- Setting.sdv:该文件用于实现用户退出登录界面。
这些视图文件通过预设的模板和逻辑,帮助开发者快速实现身份验证相关功能,而无需手动创建这些界面。
启用身份验证(授权及多租户)后,表达式设计器中的相关认证函数将可选。

启用身份验证后,在生成项目时将生成 Identity 项目,并添加身份数据库配置,用于将持久化数据存储在数据库中。 您可以打开 生成配置 页面来查看数据库配置。

授权
在项目安全页中可以选择 启用授权 选项(只有启用 JWT内部认证时可以设置)。
授权策略用于配置应用程序的授权策略,目前只能支持使用默认授权策略(JWT授权策略)或者使用匿名策略。
多租户
在项目安全页中可以选择 启用多租户支持 选项(只有启用 JWT内部认证时可以设置),用于多租户场景下的隔离与管理。
代码预览
ICurrentTenant:租户接口

ITenantProvider:租户提供者接口

IdentityCurrentTenant:当前租户默认实现类

MultiTenantMiddleware:多租户中间件

UseMultiTenantMiddleware():多租户中间件的扩展方法

从当前租户上获取数据库连接字符串和使用多租户中间件。
