JWT(JSON Webトークン)のシングルサインオンでユーザーを認証できます。この記事では、Microsoft Active Directoryのユーザー向けにJWT SSO認証を構成する方法を説明します。この設定は以下の手順に従って行います。
2. Zendeskの構成
4. トラブルシューティング
1. Windowsサーバーの構成
Windowsサーバーには、IISとASPをインストールする必要があります。IISサーバーは、ご利用のドメインに属し、ドメインコントローラに直接アクセスできる必要があります。IISサーバーはドメインコントローラと共存できますが、その必要はありません。Windows Server 2008を使用している場合は、以下のロールをインストールする必要があります。
IISロールサービスには、以下をインストールする必要があります。
- Application Development
- ASP.NET
- ASP
- サーバー側の内容は以下のとおりです。
また、セキュリティには以下を使用します。
- 基本認証
ロールとサービスが正常にインストールできたら、次に、IISサーバーの認証を構成する必要があります。Zendeskは「Basic Authentication」で正常に動作するため、通常は「Basic Authentication」をデフォルトにします。「Anonymous Authentication」は必ず無効にしてください。この認証を匿名にすると、Windowsのユーザー名とパスワードの入力を求める画面が表示されず、ログインができません。
2. Zendeskの構成
詳細については、「JWT(JSON Webトークン)を使用したシングルサインオンの設定」の記事にある「JWTシングルサインオンをZendeskで有効にする」を参照してください。 リモートログインURLの値には、次のセクションで説明するASP認証スクリプトを保存する場所を指定します。
3. 認証スクリプトのダウンロードおよび構成
ASP認証スクリプトをGithubの以下のページからダウンロードします。
https://github.com/zendesk/zendesk_jwt_sso_examples/tree/master/bun...
このスクリプトを(上位のバンドルに含まれる依存関係とあわせ)、wwwrootディレクトリに保存します。サブディレクトリを作成して保存することもできますが、スクリプトのURLが長くなる点に留意してください。新規インストールの場合、IISは、このディレクトリを以下のように作成します。
c:\inetpub\wwwroot\
Webブラウザの場合には、このフォルダのファイルは、以下のURLに表示されます。
http://serveraddress/classic_asp_jwt_with_ad.asp
メモ帳などのテキストエディターでスクリプトを開きます。スクリプトの最初の部分で構成が必要な箇所は以下のとおりです。
' Credentials for a domain user for LDAP access sLdapReaderUsername = "domain\username" sLdapReaderPassword = "password"
LDAPへアクセスするユーザーのユーザー名とパスワードを入力します。
次に、JWT Zendeskの構成時に取得する共有シークレットトークンを(スクリプト内のsKeyで指定して)入力する必要があります。また、Zendeskのサブドメインも入力が必要です。以下のように入力します。
' Set your shared secret and Zendesk subdomain
sKey = ""
sSubdomain = ""
以下の内容は、ユーザーアカウントのLDAP参照を処理するスクリプトの部分です。
sQuery = "<LDAP://" & sDomainContainer & ">;(sAMAccountName=" & sUsername & "); adspath," & sFields & ";subtree"
Set userRS = oConn.Execute(sQuery)
コードを確認したら、ユーザーのadspath、mail、displayName、sAMAccountNameを取得します。コールの際に使用するデータをさらに多く引き出す場合、コードの該当箇所に対象のデータを指定します。たとえば、メモのブロックの場合には、以下のように指定します。
「info」の属性でコードを更新するには、以下のように記述します。
sQuery = ";(sAMAccountName=" & strUsername & ");adspath,mail,displayName,sAMAccountName,info;subtree" Set userRS = oConn.Execute(sQuery)
属性の照合が完了すると、属性の使用が可能になります。以下のコードでは、実際に属性を翻訳します。
If Not userRS.EOF and not err then sFullName = userRS("displayName") sEmail = userRS("mail") sExternalID = userRS("sAMAccountName") if sOrg then sOrganization = "" end if sTags = "" sPhotoUrl = ""
displayName、mail、sAMAccountName がすでに指定されているのがわかります。ユーザーの個々の属性をコールする場合は、「userRS(「nameofattribute」)」オブジェクトを使用します。たとえば、「info」の参照が指定されており、タグにメモのブロックを使用する場合には、コードを以下のように変更します。
If Not userRS.EOF and not err then sFullName = userRS("displayName") sEmail = userRS("mail") sExternalID = userRS("sAMAccountName") if sOrg then sOrganization = "" end if sTags = userRS("info") sPhotoUrl = ""
利用可能な個々の属性とそれらの属性に使用できるオプションについては、以下を参照してください。
http://www.kouti.com/tables/userattributes.htm
「Active Directory ユーザーとコンピュータ」で「高度な機能」を有効にすると、個々の属性を直接変更できます。「高度な機能」を有効にするには、以下のように「表示」>「高度な機能」の順に選択します。
機能を有効にしたら、ユーザーのプロパティに移動し、「属性エディタ」を確認します。
組織とタグのパススルーに関する注意事項
組織をユーザーに正しくパススルーするには、Zendeskにあらかじめ組織が存在している必要があります。パススルー時に組織がZendeskに存在していない(または、組織の名前が正確に一致しない)場合、ユーザーとは異なり、作業中に組織を作成することはできません。まず、関連する組織を作成する必要があります。
タグを正しくパススルーするには、属性で以下のようにタグを列挙する必要があります。
“tag1, tag2, tag3”
「“」と「”」でタグを囲まないと、タグを正しくパススルーできません。
個々のフィールドの詳細については、この投稿に同意し、その内容をご覧ください。
スクリプトの変更が完了したら、スクリプトを保存します。Zendeskのサイトに接続し、「ログイン」をクリックします。スクリプトにリダイレクトされ、ここでWindowsの認証情報を入力すると、Zendeskにログインできます。
4. トラブルシューティング
「ログイン」をクリックしても機能しない。スクリプトの一部にデバッグオプションを組み込んであります。スクリプトのデバッグフラグを「True」にすると、スクリプトへのアクセス時にデバッグ情報が表示されます。 たとえば、次のように表示されます。
[DEBUG] ZENDESK\test - should be of the form DOMAIN\username - if blank, your IIS probably allows anonymous access to this file.
[DEBUG] DomainContainer: DC=zendesk,DC=internal
[DEBUG] Attribute name: Test User
[DEBUG] Attribute email: test@zendesk.com
[DEBUG] Attribute jti: 2968942290171.981
[DEBUG] Attribute iat: 1380123848
[DEBUG] Redirecting to https://subdomain.zendesk.com/access/jwt?jwt=eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpYXQiOjEzODAxMjM4NDgsImp0aSI6Mjk2ODk0MjI5MDE3MS45ODEsIm5hbWUiOiJUZXN0IFVzZXIiLCJlbWFpbCI6InRlc3RAemVuZGVzay5jb20ifQ.QuRC6Ig7x_nK86Wc38u2viIVjshtTDohcgXTYpmU6VY
この例では、すべての情報が正常に表示されています。組織やタグ、PhotoURLを構成した場合は、そのデータを確認できます。データの一部しか表示されない場合は、ユーザーの属性データを確認します。また、コードが正しい属性を参照しているかも確認します。
対象のページにたどりつくことができても何もデータを表示できない場合は、スクリプトがドメインコントローラに接続できていないか、スクリプトに接続の権限がありません。サーバーの共有に(実行プロンプトで\\dcservername\と指定して)接続する方法でドメインコントローラにアクセスできるかを、対象のサーバ上で確認します。次に、コードに定義したユーザー名とパスワードが正しいかどうかを確認します。また、匿名アクセスが有効になっている場合、このアクセスは認証を要求しないため、空白のページが表示されます。匿名アクセスは必ず無効にしてください。
対象のページにたどりつけず、ブラウザがエラーを返す場合は、IISに問題があります。必要なロールやサービスがサーバーにインストールされており動作しているかを確認します。上記の対応を行っても問題が解決しない問題については、このガイドの対象外であるため、IISの管理者にご相談されるようお勧めします。
実際にエラーが発生しその問題を解決された経験をお持ちの方は、その解決方法をお知らせください。現在発生している問題やその問題の解決方法に関するヒントをさらに追加して、この投稿を更新できれば幸いです。