匿名数据访问允许 Fabric 应用向未登录用户公开选定的数据操作。 你可以在 Fabric 租户层级和每个数据模型中控制这种访问。 匿名访问是一种授权选项,而非认证的替代。 同一应用可以对部分实体提供公开访问,同时要求用户登录其他实体或操作。
Important
任何能访问应用URL的人都可以使用分配给该 anonymous 角色的操作。 不要通过这个角色泄露个人、机密、财务或内部业务数据。
用例
考虑匿名数据访问,当应用必须提供有限功能且不需登录时。
| 情景 | 示例访问 | 建议的范围 |
|---|---|---|
| 公共参考数据 | 查看产品目录、时程表或公开数据集 | read |
| 反馈收集 | 提交评论或调查回复 | create |
当应用必须识别用户、强制所有权或基于身份声明提供访问权限时,匿名访问是不合适的。 在这些场景下使用认证过的角色。
匿名访问的工作原理
匿名数据访问使用独立控制:
- 租户环境:Fabric租户管理员会为组织或选定的安全组授予匿名数据访问权限。
-
数据模型角色: 实体利用该
anonymous角色定义未认证用户可以执行的操作。
租户设置是整个组织的边界。 应用设置允许匿名请求访问应用的数据服务。 实体角色决定这些请求可以访问哪些数据和操作。 只启用一两个控制并不能实现匿名访问。
启用租户设置
Fabric租户管理员必须启用匿名数据访问,应用开发者才能使用。 默认情况下,该设置处于禁用状态。
登录到 Fabric 管理门户。
选择租户设置。
在 Fabric 应用(预览)中,查找匿名数据访问。
将切换设置为“启用”。
将该设置应用于整个组织或特定安全组。
选择应用。
变更可能需要几分钟才能生效。 当你将设置限制为安全组时,确认应用开发者或应用所有者是否包含在允许的组中。
在数据模型中定义匿名访问
在实体上使用 @role 装饰器,并指定 anonymous 角色名称。 第二个参数定义允许的数据操作:create, , readupdate, 或 delete。
Parameters
| 参数 | 类型 | 说明 |
|---|---|---|
roleName |
string |
角色名称,例如 authenticated 或自定义应用程序角色 |
actions |
string \| string[] |
单个操作或操作数组:create、read、update、delete,或全部使用 * |
options |
object |
具有 check、include 和 exclude 属性的可选对象 |
以下示例允许未认证用户阅读公共公告:
import { entity, role, uuid, text } from '@microsoft/rayfin-core';
@entity()
@role('anonymous', 'read')
export class Announcement {
@uuid() id!: string;
@text() title!: string;
@text() content!: string;
}
该 anonymous 职位不使用身份声明,因为没有登录身份。 定义支持你情景的最窄操作集。
允许用户提交数据
对于反馈表单,授予 create 访问权限但不授予 read, update或 delete :
import { entity, role, uuid, text } from '@microsoft/rayfin-core';
@entity()
@role('anonymous', 'create')
export class Feedback {
@uuid() id!: string;
@text() comment!: string;
}
该模型允许用户提交反馈,但不允许查看或更改提交的条目。
允许多操作
当一个场景需要多个操作时,传递数组:
import { boolean, entity, role, text, uuid } from '@microsoft/rayfin-core';
@entity()
@role('anonymous', ['create', 'read', 'update'])
export class SharedTodo {
@uuid() id!: string;
@text() title!: string;
@boolean({ default: false }) completed!: boolean;
}
任何拥有该应用访问权限的人都可以创建、查看并更新所有共享的待办事项。 他们不能删除待办事项,因为 delete 没包含在内。 仅对公共或临时数据使用此类广泛权限,用户期望共享访问权限。
结合匿名和认证角色
当公共用户和登录用户需要不同权限时,将这两个角色应用到实体上。 例如,任何人都可以阅读一篇博客文章,但只有登录的拥有者才能更改:
import { entity, role, uuid, text } from '@microsoft/rayfin-core';
@entity()
@role('anonymous', 'read')
@role('authenticated', ['create', 'update', 'delete'], {
policy: (claims, item) => claims.sub.eq(item.createdBy),
})
export class BlogPost {
@uuid() id!: string;
@text() title!: string;
@text() content!: string;
@text() createdBy!: string;
}
匿名身份允许公众阅读,而无需评估身份声明。 认证角色利用登录用户的声明来限制对其拥有内容的更改。
安全指南
- 授予最低要求的访问权限。 喜欢
read还是create独自。 资助update还是delete只有在公共工作流程需要时才批准。 - 限制暴露场。 使用
include或exclude选项阻止匿名用户访问不需要的字段。 欲了解更多信息,请参见 定义数据权限。 - 不要只依赖应用界面来保护自己。 权限必须在数据模型上定义,因为调用者可以在不使用前端的情况下发送请求。
- 为不信任的输入做好准备。 验证提交的数据,设计针对垃圾邮件、自动化和意外流量的公开写入操作。
- 测试被拒绝手术。 确认角色中遗漏的操作对于没有会话的用户是否被拒绝。
禁用匿名访问
要移除应用中的公开访问权限:
- 从每个数据模型中移除该
anonymous角色。 - 通过运行
npx rayfin up. 重新部署应用。
租户管理员还可以禁用租户设置,阻止租户内所有应用的匿名数据访问,并限制对特定安全组的访问。