8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

プリザンター(.NET Core版)でSAML認証する

Last updated at Posted at 2021-05-21

前提環境

  • プリザンター(.NET Core)版が動作していること
    • 今回は、Ubuntu上で動作している、プリザンターを利用
  • IDPが準備されていること
    • 今回は、Microsoft Azure ADを利用

はじめに

公式のユーザマニュアルに、プリザンター(.NET Framework)の場合のマニュアルは記載があるのですが、.NET Core版は記載がありません。
.NET Coreだからなのかはわかっていませんが、Web.configは関係ないようなので、注意が必要です。

IDPにプリザンターをアプリケーションとして登録する

今回は、Azure ADの場合で紹介をします。(ほとんどプリザンターとは関係ないです。)

  1. Azure ADの管理ポータルを開き、「エンタープライズ アプリケーション」の画面を開きます。
    続けて、「新しいアプリケーション」をクリックします。
    image.png

  2. 「独自のアプリケーションの作成」をクリックします。
    image.png

  3. アプリの名前を入力し、「ギャラリー以外」が選択されていることを確認し、「OK」をクリックします。
    image.png

  4. 作成したアプリを利用出来る、ユーザとグループを選択します。
    「1.ユーザとグループの割り当て」をクリックします。
    image.png

  5. 「ユーザまたはグループの追加」をクリックします。
    image.png

  6. 「選択されていません」をクリックします。
    image.png

  7. 右側のにユーザとグループの一覧が表示されるため、適当なユーザもしくはグループを選択し、「選択」をクリックします。
    image.png

  8. ユーザが選択されている事を確認し、「割り当て」をクリックします。
    image.png

  9. もとの戻るため、左のメニューから「概要」をクリックします。
    「2.シングルサインオンの設定」をクリックします。
    image.png

  10. 「シングルサインオン方式の選択」から「SAML」を選択します。
    image.png

  11. 「SAMLによるシングルサインオンのセットアップ」が表示されるため、「1 基本的なSAML構成」の「編集」をクリックします。
    image.png

  12. 「基本的なSAML構成」で、下記のように入力し、「保存」をクリックします。
    識別子(エンティティID):https://プリザンターのURL/Saml2
    応答URL(Asserion Consumer Service URL):https://プリザンターのURL/Saml2/Acs
    ちなみに、応答URLはhttpsで始まるURLしか設定出来ません。 1
    image.png

  13. もとの画面に戻るため、「2 ユーザ属性とクレーム」の「編集」をクリックします。
    image.png

  14. 「ユーザ属性とクレーム」から「新しいクレームの追加」をクリックします。
    image.png

  15. 「要求の管理」が表示されるため、「名前」に「Name」と入力し、「ソース属性」から「user.displayname」を選択し、「保存」をクリックします。
    image.png

  16. もとの画面に戻ります。

Azure AD側での設定は完了です。

必要な情報を確認する

引き続き、プリザンターの設定に必要な情報を確認します。
先ほどのAzure ADの画面から「3 SAML署名証明書」「4 Pleasanter のセットアップ」から、次の項目を確認致します。

  • 「SAML 署名証明書」の「拇印」
  • 「プリザンター(Qiita)のセットアップ」の「ログインURL」
  • 「プリザンター(Qiita)のセットアップ」の「Azure AD 識別子」

image.png

プリザンターの設定を行う

Implem.Pleasanter/App_Data/Parameters/Authentication.json
{
    "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 修正:上記の記載は誤りでプリザンター側にアカウントがないと、ログイン画面に戻される仕様となっているようです。

image.png

補足:リバース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」を設定する必要があります。

Implem.Pleasanter/App_Data/Parameters/Authentication.json
{
//・・・・・・ 中略
    "SamlParameters": {
//・・・・・・ 中略
        "SPOptions": {
            "PublicOrigin": "https://pleasanter.exapmle.com",
  1. リバースProxyなどを入れてSSL化する必要あり

8
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?