匿名データアクセスにより、Fabricアプリはサインインしていないユーザーに選択されたデータ操作を公開できます。 このアクセスはFabricテナントレベルおよび各データモデルで制御できます。 匿名アクセスは認証の代替ではなく、認証の選択肢です。 同じアプリは一部の組織に公共アクセスを提供しつつ、他の組織や操作にはサインインを要求します。
Important
アプリのURLにアクセスできる人は、 anonymous ロールに割り当てられた操作を利用できます。 この役割を通じて、個人情報、機密、財務、内部のビジネスデータを漏らさないでください。
ユースケース例
サインイン義務なしに限定的な機能しか提供できない場合、匿名データアクセスを考えてみましょう。
| Scenario | アクセス例 | 推奨されるスコープ |
|---|---|---|
| 公開参照データ | 製品カタログ、スケジュール、公開データセットを閲覧 | read |
| フィードバック収集 | コメントやアンケート回答を投稿してください | create |
匿名アクセスは、ユーザーが特定され、所有権を強制し、またはアイデンティティの主張に基づいてアクセスを提供する必要がある場合には適切ではありません。 そういったシナリオでは認証済みロールを使いましょう。
匿名アクセスの仕組み
匿名データアクセスは独立した管理手段を使用します:
- テナント環境:Fabricのテナント管理者は、組織または選ばれたセキュリティグループに対して匿名のデータアクセスを許可します。
-
データモデルの役割: エンティティは
anonymousロールを使って、認証されていないユーザーが実行できる操作を定義します。
テナント設定とは、組織全体の境界線です。 アプリの設定では、匿名のリクエストがアプリのデータサービスに到達できるようになっています。 エンティティの役割は、そのリクエストがアクセスできるデータや操作を決定します。 これらのコントロールのうち1つか2つだけを有効にしても匿名アクセスはできません。
テナント設定を有効にしてください
Fabricのテナント管理者が匿名データアクセスを有効にする前に、アプリ開発者が利用できるようにしなければなりません。 この設定は、既定では無効になっています。
Fabric 管理ポータルにサインインします。
テナント設定 を選択します。
Fabricアプリ(プレビュー)で「匿名データアクセス」を見つけてください。
トグルを [有効] に設定します。
この設定を組織全体や特定のセキュリティグループに適用してください。
を選択してを適用します。
変更が現れるまで数分かかることもあります。 設定をセキュリティグループに限定する場合は、アプリ開発者または所有者が許可されたグループに含まれているか確認してください。
データモデルにおける匿名アクセスの定義
エンティティのデコレーター @role を使い、ロール名として anonymous を指定してください。 2つ目の引数は、許容されるデータ操作( create、 read、 update、または delete)を定義します。
Parameters
| Parameter | タイプ | 説明 |
|---|---|---|
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ロールはサインイン済みのIDがないため、アイデンティティクレームを使用しません。 シナリオをサポートする最も狭い操作セットを定義してください。
ユーザーがデータを送信できるように
フィードバックフォームの場合、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;
}
このアプリにアクセスできる誰でも、共有されたToDoをすべて作成、閲覧、更新できます。 ToDoは削除できません。なぜなら 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オプションを使って、匿名ユーザーが不要なフィールドへのアクセスを防いでいます。 詳細については 、「データ権限の定義」をご覧ください。 - アプリのUIに頼って保護しないようにしましょう。 パーミッションはデータモデル上で定義しなければなりません。なぜなら、呼び出し者はフロントエンドを使わずにリクエストを送信できるからです。
- 信頼できない入力に備えましょう。 提出されたデータの検証を行い、スパム、自動化、予期せぬトラフィックに対する公開書き込み操作を設計します。
- 検査は手術拒否。 ロールから省略された操作がセッションを持たないユーザーに対して拒否されているか確認してください。
匿名アクセスを無効にする
アプリからパブリックアクセスを削除するには:
- 各データモデルから
anonymous役割を削除してください。 -
npx rayfin upを実行してアプリを再デプロイしてください。
テナント管理者は、テナント内のすべてのアプリの匿名データアクセスをブロックし、選択されたセキュリティグループへのアクセスを制限するテナント設定を無効にすることもできます。