前提環境
- プリザンター(.NET Core)版が動作していること
- 今回は、Ubuntu上で動作している、プリザンターを利用
- IDPが準備されていること
- 今回は、Microsoft Azure ADを利用
はじめに
公式のユーザマニュアルに、プリザンター(.NET Framework)の場合のマニュアルは記載があるのですが、.NET Core版は記載がありません。
.NET Coreだからなのかはわかっていませんが、Web.configは関係ないようなので、注意が必要です。
IDPにプリザンターをアプリケーションとして登録する
今回は、Azure ADの場合で紹介をします。(ほとんどプリザンターとは関係ないです。)
-
Azure ADの管理ポータルを開き、「エンタープライズ アプリケーション」の画面を開きます。
続けて、「新しいアプリケーション」をクリックします。
-
「SAMLによるシングルサインオンのセットアップ」が表示されるため、「1 基本的なSAML構成」の「編集」をクリックします。
-
「基本的なSAML構成」で、下記のように入力し、「保存」をクリックします。
識別子(エンティティID):https://プリザンターのURL/Saml2
応答URL(Asserion Consumer Service URL):https://プリザンターのURL/Saml2/Acs
ちなみに、応答URLはhttpsで始まるURLしか設定出来ません。 1
-
「要求の管理」が表示されるため、「名前」に「Name」と入力し、「ソース属性」から「user.displayname」を選択し、「保存」をクリックします。
-
もとの画面に戻ります。
Azure AD側での設定は完了です。
必要な情報を確認する
引き続き、プリザンターの設定に必要な情報を確認します。
先ほどのAzure ADの画面から「3 SAML署名証明書」「4 Pleasanter のセットアップ」から、次の項目を確認致します。
- 「SAML 署名証明書」の「拇印」
- 「プリザンター(Qiita)のセットアップ」の「ログインURL」
- 「プリザンター(Qiita)のセットアップ」の「Azure AD 識別子」
プリザンターの設定を行う
{
"Provider": "SAML", // SAMLに書き換えます。
"ServiceId": null,
//・・・・・・ 中略
"SamlParameters": {
"Attributes": {
"Name": "Name",
"UserCode": "UserCode",
"Birthday": "Birthday",
"Gender": "Gender",
"Language": "Language",
"TimeZone": "TimeZone",
"TenantManager": "TenantManager",
"DeptCode": "DeptCode",
"Dept": "Dept",
"Body": "Body",
"MailAddress": "{NameId}"
},
"SamlTenantId": 1,
"SPOptions": {
// この部分は最後で説明
"PublicOrigin": "https://pleasanter.exapmle.com",
// https://プリザンターのURL/Saml2
"EntityId": "https://pleasanter.exapmle.com/Saml2",
// https://プリザンターのURL/Users/SamlLogin
"ReturnUrl": "https://pleasanter.exapmle.com/Users/SamlLogin",
"AuthenticateRequestSigningBehavior": "IfIdpWantAuthnRequestsSigned",
"OutboundSigningAlgorithm": "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256",
"MinIncomingSigningAlgorithm": "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256",
"ServiceCertificates": []
},
"IdentityProviders": [
{
// Azure ADの画面で確認した、「プリザンター(Qiita)のセットアップ」の「Azure AD 識別子」
"EntityId": "https://sts.windows.net/........./",
// 「プリザンター(Qiita)のセットアップ」の「ログインURL」
"SignOnUrl": "https://login.microsoftonline.com/......../saml2",
"LogoutUrl": null,
"AllowUnsolicitedAuthnResponse": true,
"Binding": "HttpPost",
"WantAuthnRequestsSigned": false,
"DisableOutboundLogoutRequests": true,
"LoadMetadata": false,
"MetadataLocation": null,
"SigningCertificate": {
"StoreName": "CurrentUser",
"StoreLocation": "My",
"X509FindType": "FindByThumbprint",
// 「SAML 署名証明書」の「拇印」
"FindValue": "ABCDEF01234567ABCDEF"
}
}
]
}
}
動作確認
プリザンターを再起動し、ログイン画面を表示します。
設定がうまく出来ていれば、ログイン画面に「SSOログイン」のアイコンが表示されていると思います。
クリックして、問題無くログイン出来れば完了です。
なお、プリザンターでは、認証が通れば、プリザンター側にアカウントが無くても、自動でアカウントが作成されるようになっているようです。
2021/5/24 修正:上記の記載は誤りでプリザンター側にアカウントがないと、ログイン画面に戻される仕様となっているようです。
補足:リバースProxy環境で使う場合
プリザンターをリバースProxyでSSL化して、SAML認証する場合、次の設定が必要です。
具体的には、SAML認証の際に内部で生成されるURLがhttpsとならず、AzureAD側で設定したACS URLとマッチせず、エラーとなってしまいます。
プリザンターでは、SAML認証に Sustainsys.Saml2 というパッケージが利用されていますが、こちらのパラメタ(publicOrigin)を触る必要があります。
2021/5/22現在のコードでは、このパラメタを触ることが出来ないため、次のパッチを当て、ビルドしなおしました。
Pleasanter.NetCore 1.1.30.0以降で、本家に取り込んで頂きましたので次のパッチは不要です。
diff --git a/Implem.ParameterAccessor/Parts/SPOptions.cs b/Implem.ParameterAccessor/Parts/SPOptions.cs
index a5b01dd4..db607be9 100644
--- a/Implem.ParameterAccessor/Parts/SPOptions.cs
+++ b/Implem.ParameterAccessor/Parts/SPOptions.cs
@@ -7,6 +7,7 @@ namespace Implem.ParameterAccessor.Parts
{
public string EntityId;
public string ReturnUrl;
+ public string PublicOrigin;
public string AuthenticateRequestSigningBehavior;
public string OutboundSigningAlgorithm;
public string MinIncomingSigningAlgorithm;
diff --git a/Implem.Pleasanter/Libraries/DataSources/Saml.cs b/Implem.Pleasanter/Libraries/DataSources/Saml.cs
index 667bcd79..337d4498 100644
--- a/Implem.Pleasanter/Libraries/DataSources/Saml.cs
+++ b/Implem.Pleasanter/Libraries/DataSources/Saml.cs
@@ -227,6 +227,9 @@ namespace Implem.Pleasanter.Libraries.DataSources
= paramSPOptions.ReturnUrl.IsNullOrEmpty() ? null : new Uri(paramSPOptions.ReturnUrl);
options.SPOptions.EntityId
= paramSPOptions.EntityId.IsNullOrEmpty() ? null : new EntityId(paramSPOptions.EntityId);
+ options.SPOptions.PublicOrigin
+ = paramSPOptions.PublicOrigin.IsNullOrEmpty() ? null : new Uri(paramSPOptions.PublicOrigin);
+
options.SPOptions.MinIncomingSigningAlgorithm
= paramSPOptions.MinIncomingSigningAlgorithm
?? options.SPOptions.MinIncomingSigningAlgorithm;
@@ -473,4 +476,4 @@ namespace Implem.Pleasanter.Libraries.DataSources
return true;
}
}
-}
\ No newline at end of file
+}
その上で、次のように「Authentication.json」の「SamlParameters.SPOptions.PublicOrigin」に
「https://プリザンターのURL」を設定する必要があります。
{
//・・・・・・ 中略
"SamlParameters": {
//・・・・・・ 中略
"SPOptions": {
"PublicOrigin": "https://pleasanter.exapmle.com",
-
リバースProxyなどを入れてSSL化する必要あり ↩