OpenID ConnectとSAMLサインイン
Microsoft、Google、Facebookのほかに、ポータルは OpenID Connect や SAML 2.0 のアイデンティティプロバイダーからもサインインできます:Okta、Auth0、Microsoft Entra External ID、顧客またはパートナーのEntraテナント、AD FS、Ping、Google Workspaceなどです。設定する各プロバイダーはサインインページのボタンだけで、コードは不要です。
これらのプロバイダーのいずれかを通じたサインインは、MicrosoftやGoogleのサインインと同様に、連絡先としてマッチング、リンク、または登録されます。内部ユーザー(システムユーザー)はMicrosoftでサインインします — Entra IDサインイン設定を参照してください。
つけて
外部ユーザー向けにテンプレートから作成されたプロジェクトにはすでに Program.csが入っています。このシステムは Authentication:OpenIdConnect および Authentication:Saml2で設定されたすべてのプロバイダーを読み取り、設定が完了するまでは追加しません:
builder.Services.AddAuthentication()
.AddOpenIdConnectProviders(builder.Configuration)
.AddSaml2Providers(builder.Configuration);
SAMLは PowerPortalsPro.Identity.Saml2 パッケージから来ており、これらのプロジェクトはそれを参照しています。この機能の前に作成されたプロジェクトは、呼び出しとパッケージの追加が必要です。
プロバイダーに登録するアドレス
各プロバイダーには名前があり、以下の例でその構成セクションのキー ContosoOkta 、プロバイダーが送り返すアドレスはその名前から小文字で作成されます。ポータルが動作する各ホストごとに正確に一度ずつ登録してください。
| 何だって | 住所 |
|---|---|
| OpenID Connect リダイレクト URI | https://your-portal.example.com/signin-{name} |
| SAMLアサーションコンシューマーサービス(HTTP-POST) | https://your-portal.example.com/saml2/{name}/acs |
| SAMLエンティティID(オーディエンス) | https://your-portal.example.com/saml2/{name} |
| ポータルのSAMLメタデータ | https://your-portal.example.com/saml2/{name}/metadata |
アドレスはすべての言語で同じです。別の言語のページ( /es/… )でサインインが始まると、サイト自身のアドレスを経由して、その言語で開始ページに戻ってきます。
OpenID Connectプロバイダー
Authentication:OpenIdConnectの下に各プロバイダーごとにセクションを追加してください。クライアントはローカルのユーザーシークレットと展開後のKey Vaultで秘密に保ちます。
{
"Authentication": {
"OpenIdConnect": {
"ContosoOkta": {
"DisplayName": "Contoso",
"Authority": "https://contoso.okta.com/oauth2/default",
"ClientId": "0oa1b2c3d4e5f6g7h8i9",
"ClientSecret": "<in user secrets or Key Vault>",
"TrustedEmailDomains": [ "contoso.com" ]
}
}
}
}
| 舞台設定 | それは何か |
|---|---|
DisplayName | サインインボタンに表示されている名前です。プロバイダー名がデフォルトになります。 |
Authority | 提供者の発行者 — その /.well-known/openid-configuration の住所。 MetadataAddress が示されていない限り必須です。 |
MetadataAddress | ディスカバリードキュメントの住所で、別の場所で公開するプロバイダーの住所です。 |
ClientId, ClientSecret | ポータルのクライアントIDとプロバイダーの秘密情報。必須です。 |
Scopes | openid、profile、email以外にも望遠鏡をリクエストしてください。これらは常に求められます。 |
CallbackPath | URIの経路をリダイレクトするだけでは、 /signin-{name} ではダメです。 |
TrustedEmailDomains | このプロバイダーが信頼されているメールドメイン — 以下で 「どのアドレスが信頼されているか 」を参照してください。デフォルトで空です。App Serviceの設定では、カンマ区切って書いてください。 |
GetClaimsFromUserInfoEndpoint | プロバイダーのユーザー情報エンドポイントからプロファイルとIDトークンの両方を読むかどうか。デフォルトではオンにしています。プロバイダーによってはIDトークンにメールアドレスが含まれていない場合もあります。 |
ポータルはPKCEによる認証コードフローを使用し、Identityの外部クッキーを通じてサインインし、トークンは保持しません。 subのIDと、 email、 given_name 、 family_nameの住所と名前を読み取ります。
Okta (OpenID Connect)
- アプリ統合を作成します: OIDC - OpenID Connect( Web Application型)で、 認証コード 付与を得ています。
- ポータルのリダイレクトURIを サインインリダイレクトURIとして追加し、サインイン可能な人やグループを割り当て、クライアントIDとシークレットをコピーします。
- 権限者はあなたの認可サーバーの発行者であり、例えば
https://contoso.okta.com/oauth2/default。
Auth0
- 通常のWebアプリケーション型のアプリケーションを作成します。
- ポータルのリダイレクトURIを 許可されたコールバックURLに追加し、クライアントIDとシークレットをコピーします。
- 権限はテナントのドメイン(例:
https://contoso.us.auth0.com/)やカスタムドメインです。
Microsoft Entra External ID
- 外部テナントで、ポータルのリダイレクトURIを使ってアプリケーションを Web リダイレクトURIとして登録し、クライアントシークレットを追加します。
- サインアップとサインインのユーザーフローを作成し、アプリケーションを追加してください。
- 権限は
https://<tenant subdomain>.ciamlogin.com/<tenant id>/v2.0です。ユーザーフローがアカウント作成前に各アドレスを認証する場合(パスワード付きメールとワンタイムパスコードのメールの両方が認証されます)、これは自分の顧客のために運営するIDプロバイダーであり、TrustedEmailDomains*可能です。
顧客またはパートナーのEntraテナント
マルチテナントのMicrosoftボタンなしで、従業員が自分の仕事用アカウントでサインインすべき組織の場合:
- テナント内で、ポータルのリダイレクトURIを使い、 単一のテナント アプリケーションを Web リダイレクトURIとして登録し、クライアントシークレットを追加します。
- 権限は
https://login.microsoftonline.com/<their tenant id>/v2.0。 TrustedEmailDomainsにドメインを記載し、他の場所の住所はまずメールで確認します。テナントのIDはMicrosoftボタンと同様にセッションに届きます。Entra自身の認証クレーム(xms_edov、verified_primary_email)はプロバイダーから取得されるのではなく、送信されるクレームを管理しているのはその背後にあるテナントです。
SAML 2.0プロバイダー
Authentication:Saml2の下に各プロバイダーごとにセクションを追加します。プロバイダーのメタデータはポータルにサインオンアドレスと応答に署名される証明書を提供します。毎日読み返されるため、プロバイダーがロールオーバーした証明書が取得されます。
{
"Authentication": {
"Saml2": {
"Fabrikam": {
"DisplayName": "Fabrikam",
"MetadataAddress": "https://login.microsoftonline.com/<tenant id>/federationmetadata/2007-06/federationmetadata.xml?appid=<app id>",
"TrustedEmailDomains": [ "fabrikam.com" ]
}
}
}
}
| 舞台設定 | それは何か |
|---|---|
DisplayName | サインインボタンに表示されている名前です。プロバイダー名がデフォルトになります。 |
MetadataAddress | アイデンティティプロバイダーのメタデータのアドレス。必須であり、 httpsでなければなりません。 |
IdentityProviderEntityId | アイデンティティプロバイダーのエンティティIDで、応答はそのエンティティIDによって発行されなければなりません。デフォルトはメタデータ名のエンティティです。 |
EntityId | ポータル自身のエンティティIDです。リクエストが届いたホストでデフォルトで https://{host}/saml2/{name} されます。ポータルが複数のホストで応答した際に設定し、プロバイダーで1つの登録を共有します。 |
CallbackPath, MetadataPath | アサーション、コンシューマーサービスのパス、そしてメタデータのパス、 /saml2/{name}/acs や /saml2/{name}/metadata ではうまくいかない場合。 |
TrustedEmailDomains | このプロバイダーが信頼されているメールドメイン — 以下で 「どのアドレスが信頼されているか 」を参照してください。デフォルトで空です。App Serviceの設定では、カンマ区切って書いてください。 |
AllowIdentityProviderInitiated | プロバイダーがサインインを受け入れます — 誰かが自分のプロバイダーのダッシュボードのタイルからポータルを開きます。デフォルトでオフです。ポータルの外部ログインページに進み、その後RelayState(/orders または ReturnUrl=/orders)で命名されたローカルページに移動します。各サーバーごとに1回ずつ応答が受け入れられます。 |
RequireHttpsMetadata | MetadataAddresshttpsしなければならないかどうか。デフォルトでオンにし、自分のマシンで動作するプロバイダーを試すためだけにオフにしてください。 |
応答は、プロバイダーのメタデータ内の証明書によって署名されなければなりません。これはそのエンティティIDによって発行され、ポータルのエンティティIDに対して発行され、アサーション・コンシューマーサービスに送信され、同じブラウザが行ったリクエストに応じて応答されます。NameIDはアカウントを識別するため、 永続的 であるかメールアドレスでなければなりません。一時的なメールアドレスは拒否されます。アドレスと名前は、プロバイダーが一般的に使用する属性から読み取られます: email、 mail、 emailaddress 、WS-Federationの主張名、 givenName または firstName 、 surname または lastNameです。
Microsoft Entra ID (enterprise application)
- エンタープライズアプリケーションを作成し、 ギャラリーに見つからない他のアプリケーションを統合し、 SAML シングルサインオンを選択します。
- 識別子(エンティティID)をポータルのエンティティIDに設定し、返信URLをアサーションコンシューマーサービスに設定します。
- App FederationのメタデータURLを
MetadataAddressにコピーし、サインインできるユーザーやグループを割り当ててください。
オクタ(SAML)
- SAML 2.0型のアプリ統合を作成します。
- シングルサインオンURLをアサーションコンシューマーサービスに、Audience URI(SPエンティティID)をポータルのエンティティIDに設定します。PersistentまたはEmailAddressの名前ID形式を選択し、
email、firstName、lastName属性文を追加します。 - アプリケーションの メタデータURL を
MetadataAddressにコピーしてください。
AD FS
- 信頼関係者信託を追加し、ポータルのアドレスからメタデータをインポートします。
- 請求発行ルールを追加し、メールアドレス、名前と姓、永続的な名前IDを送信します。
MetadataAddresshttps://<your AD FS host>/FederationMetadata/2007-06/FederationMetadata.xml。
署名されたリクエストと暗号化された主張
ほとんどのプロバイダーはどちらも必要ありません。署名付き認証要求が必要なものやアサートを暗号化するものであれば、証明書と一緒にコードでプロバイダーを追加してください。両方ともポータルのメタデータに公開され、プロバイダーがインポートできます。
builder.Services.AddAuthentication().AddPortalSaml2(
"Fabrikam",
new Saml2ProviderSettings
{
DisplayName = "Fabrikam",
MetadataAddress = "https://sts.fabrikam.com/FederationMetadata/2007-06/FederationMetadata.xml",
TrustedEmailDomains = ["fabrikam.com"],
},
options =>
{
options.SigningCertificate = signingCertificate;
options.DecryptionCertificate = decryptionCertificate;
});
どのアドレスが信頼されているか
ポータルが信頼するアドレスのサインインは、そのアドレスを持つ連絡先に直接入力され、そのアドレスが確認された新しいアカウントが始まります。他のアドレスはまず一度だけメールで確認されます。その後はサインインと連絡先の間のリンクがそのアドレスを見つけます。
- プロバイダーは
TrustedEmailDomainsに記載されたドメインのみを信頼し、正確にマッチングされています —contoso.comはmail.contoso.comをカバーしません。プロバイダーの背後にある組織が管理するメールボックスのドメインをリストアップしてください。 - 住所の認証をしていないと言うプロバイダー(OpenID Connectの
email_verifiedはfalse)は、リストが何と言おうと信用されません。 - それ以外は何もありません。プロバイダーはポータル自身の請求を送って住所を保証できず、別の方法で追加されたサインイン方式でも保証はなりません。
重要
*プロバイダーが主張するすべてのアドレスを信頼します。自分のユーザー向けに運営し、アドレスを認証する前に確認するアイデンティティプロバイダーにのみ使用してください。顧客やパートナーが管理するプロバイダーには絶対に使わないでください。管理者は他の組織の連絡先を含む任意のアドレスでアカウントを作成でき、その連絡先としてサインインできます。
サインインボタン
各プロバイダーはサインインページ上のボタンで、表示名でラベル付けされています。プロバイダーのセクションにさらに4つの設定があると、ボタンの見た目や位置が変わります:
| 舞台設定 | それは何か |
|---|---|
Icon | 標準ボタンの名前の前に小さなロゴが表示される、例えば顧客のサインイン時のロゴなどです。 |
ButtonImage | 標準ボタンの代わりに表示される画像:プロバイダー自身の「サインイン...」ボタン。 |
ButtonImageDark | 暗いテーマも同じイメージです。それがなければ、 ButtonImage は両方で使われます。 |
Order | ボタンの位置:下のボタンが先で、同じ順番のボタンは提供者が追加された順番を維持します。デフォルトで0です。 |
画像はサイトのルートからのパス、例えばポータルの wwwrootにあるファイル( /images/contoso-logo.svg など)または https アドレスです。パスはサイトのルートから、すべてのページ、すべての言語で提供されます。それ以外のものは起動時にポータルを停止し、設定名を付けます。
"ContosoOkta": {
"DisplayName": "Contoso",
"Icon": "/images/contoso-logo.svg",
"Order": -1,
...
}
MicrosoftやGoogleを含む他のプロバイダーのボタンはコードで変更されます:
builder.Services.ConfigureSignInButton("Microsoft", button => button.Order = 1);
Microsoft、Google、Facebookはそれぞれ独自の「サインイン...」ボタンを表示します。ライト版とダーク版の両方で、これらのボタンのいずれかを設定しない限り。
トラブルシューティング
- プロバイダーはリダイレクトURIやリリバイスURLを拒否します。 それはスキーム、ホスト、ポート、パスと完全に一致しなければなりません。ポータルが動作するすべてのホストごとに
https://{host}/signin-{name}、すなわちSAMLアドレスを登録してください。 - ポータルが起動せず、
Authentication:OpenIdConnectやAuthentication:Saml2設定が指定されます。 設定済みのプロバイダーが必要な値が欠けているか、誤った形で設定されています。MCPサーバーのcheck_setupには各プロバイダー、欠けているもの、登録すべきアドレスが記載されています。 - SAMLのサインインは「署名が無効です」と表示され失敗します。 応答はポータルが認識していない証明書によって署名されました。通常はプロバイダーが証明書をロールオーバーしたためです。ポータルは1日以内にメタデータを再度読み取ります。今から読み取るために再起動してください。
- 「オーディエンス検証に失敗」または「発行者無効」などです。 プロバイダーに登録されたエンティティIDはポータルが使うものではなく、
EntityIdに合わせるように設定されているもので、または回答がIdentityProviderEntityId名前以外のエンティティから来ているものではありません。 - SAMLのサインインはNameIDが一時的であるため失敗します。 プロバイダーに永続的なNameIDまたはメールアドレスを送信してもらいましょう。
- プロバイダーのダッシュボードタイルからポータルを開くと、サインインページに戻ります。 ポータルはそのサインインを求めていません。そのプロバイダーの
AllowIdentityProviderInitiatedを設定してください。 - 最初のサインインごとに確認メールが送信されます。 アドレスのドメインはプロバイダーの
TrustedEmailDomainsに含まれていません。それが安全なデフォルトです。アドレスが確認されると、その後のサインインはそのまま入ります。
