Fabric 应用中的匿名数据访问

匿名数据访问允许 Fabric 应用向未登录用户公开选定的数据操作。 你可以在 Fabric 租户层级和每个数据模型中控制这种访问。 匿名访问是一种授权选项,而非认证的替代。 同一应用可以对部分实体提供公开访问,同时要求用户登录其他实体或操作。

Important

任何能访问应用URL的人都可以使用分配给该 anonymous 角色的操作。 不要通过这个角色泄露个人、机密、财务或内部业务数据。

用例

考虑匿名数据访问,当应用必须提供有限功能且不需登录时。

情景 示例访问 建议的范围
公共参考数据 查看产品目录、时程表或公开数据集 read
反馈收集 提交评论或调查回复 create

当应用必须识别用户、强制所有权或基于身份声明提供访问权限时,匿名访问是不合适的。 在这些场景下使用认证过的角色。

匿名访问的工作原理

匿名数据访问使用独立控制:

  1. 租户环境:Fabric租户管理员会为组织或选定的安全组授予匿名数据访问权限。
  2. 数据模型角色: 实体利用该 anonymous 角色定义未认证用户可以执行的操作。

租户设置是整个组织的边界。 应用设置允许匿名请求访问应用的数据服务。 实体角色决定这些请求可以访问哪些数据和操作。 只启用一两个控制并不能实现匿名访问。

启用租户设置

Fabric租户管理员必须启用匿名数据访问,应用开发者才能使用。 默认情况下,该设置处于禁用状态。

  1. 登录到 Fabric 管理门户

  2. 选择租户设置

  3. Fabric 应用(预览)中,查找匿名数据访问

    Fabric管理门户中匿名数据访问设置的截图。

  4. 将切换设置为“启用”。

  5. 将该设置应用于整个组织或特定安全组。

  6. 选择应用

变更可能需要几分钟才能生效。 当你将设置限制为安全组时,确认应用开发者或应用所有者是否包含在允许的组中。

在数据模型中定义匿名访问

在实体上使用 @role 装饰器,并指定 anonymous 角色名称。 第二个参数定义允许的数据操作:create, , readupdate, 或 delete

Parameters

参数 类型 说明
roleName string 角色名称,例如 authenticated 或自定义应用程序角色
actions string \| string[] 单个操作或操作数组:createreadupdatedelete,或全部使用 *
options object 具有 checkincludeexclude 属性的可选对象

以下示例允许未认证用户阅读公共公告:

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 访问权限但不授予 readupdatedelete

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 只有在公共工作流程需要时才批准。
  • 限制暴露场。 使用 includeexclude 选项阻止匿名用户访问不需要的字段。 欲了解更多信息,请参见 定义数据权限
  • 不要只依赖应用界面来保护自己。 权限必须在数据模型上定义,因为调用者可以在不使用前端的情况下发送请求。
  • 为不信任的输入做好准备。 验证提交的数据,设计针对垃圾邮件、自动化和意外流量的公开写入操作。
  • 测试被拒绝手术。 确认角色中遗漏的操作对于没有会话的用户是否被拒绝。

禁用匿名访问

要移除应用中的公开访问权限:

  1. 从每个数据模型中移除该 anonymous 角色。
  2. 通过运行 npx rayfin up. 重新部署应用。

租户管理员还可以禁用租户设置,阻止租户内所有应用的匿名数据访问,并限制对特定安全组的访问。