> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ABBYY FlexiCapture 12 での SAML ID プロバイダーを使用した認証

> SAML ID プロバイダーを介して ABBYY FlexiCapture 12 ユーザーを認証します。SAML データを取得し、Base64 エンコードして Application Server に POST し、チケットを使用します。

<div id="overview-of-the-authentication-process">
  ## 認証プロセスの概要
</div>

SAML 認証を使用すると、ABBYY FlexiCapture 12 のユーザーは、サードパーティの ID プロバイダー (Google や Facebook など) で認証を行い、その後、信頼できるサードパーティから認証成功に関するデータを Application Server に渡すことで、ユーザー名やパスワードなどの ID 情報を FlexiCapture の Application Server コンポーネントに送信せずに済みます。

ユーザーアプリケーションにおける SAML 認証プロセスは、次の手順で構成されます。

* サードパーティの ID プロバイダーで認証する
* サードパーティの ID プロバイダーからユーザーの SAML 認証データを取得する
* SAML 認証データを Application Server に送信する
* Application Server から認証済みチケットを受け取る

このチケットは、その後、Application Server へのリクエストで使用できます。

<Note>
  ユーザーアカウントは FlexiCapture データベース内に存在し、必要な権限をすべて持っている必要があります。
</Note>

<div id="implementation">
  ## 実装
</div>

<div id="get-saml-data">
  ### SAML データを取得する
</div>

サードパーティのID プロバイダーから取得した SAML データは、次の形式になります (この例は OneLogin のものです) ：

```xml theme={null}
<?xml version="1.0" encoding="UTF-8" ?>
   <samlp:Response xmlns:saml = "urn:oasis:names:tc:SAML:2.0:assertion"
   xmlns:samlp = "urn:oasis:names:tc:SAML:2.0:protocol" ID = "R85bc5e644b6749bf20939c99cacf35945d74bf48" Version = "2.0"
   IssueInstant = "2016-09-15T09:56:20Z" Destination = "{recipient}" InResponseTo = "_1ba6250c-3c4e-49e1-9bff-fc82bc266b34">
      <saml:Issuer>https://app.onelogin.com/saml/metadata/585198</saml:Issuer>
      <samlp:Status><samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/></samlp:Status>
      <saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
         xmlns:xs="https://www.w3.org/2001/XMLSchema"
         xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" Version="2.0" ID="pfx5b0edaf1-7296-f635-b387-a964c92e4d5f" IssueInstant="2016-09-15T09:56:20Z">
         <saml:Issuer>https://app.onelogin.com/saml/metadata/585198</saml:Issuer>
         <ds:Signature xmlns:ds="https://www.w3.org/2000/09/xmldsig#">
            <ds:SignedInfo>
               <ds:CanonicalizationMethod Algorithm="https://www.w3.org/2001/10/xml-exc-c14n#"/>
               <ds:SignatureMethod Algorithm="https://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
               <ds:Reference URI="#pfx5b0edaf1-7296-f635-b387-a964c92e4d5f">
                  <ds:Transforms>
                     <ds:Transform Algorithm="https://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                     <ds:Transform Algorithm="https://www.w3.org/2001/10/xml-exc-c14n#"/>
                  </ds:Transforms>
                  <ds:DigestMethod Algorithm="https://www.w3.org/2000/09/xmldsig#sha1"/>
                  <ds:DigestValue>udRgHOqBktJRsEzF5xkmJMOuwIk=</ds:DigestValue>
               </ds:Reference>
            </ds:SignedInfo>
            <ds:SignatureValue>LfHQBqg+S72CtSefOA8KMNxTUpOJcFCdemZ2BlCU/FR1n6pnLqZT6+m90729ciy7CNzT/w40GCcuVDggcgDKFqDb47Wzc6vs7ejC8W9OAdbJKXBK5jwYeYcJO4utN15k4e18Bv8zv96Bx/C8mBxcflSSP5C/tDAtbzvPBsyd25qADNTsKxwppZxAh4frdmSFQ4rYCOO1PnBFrS3zzguGXB9ZM0V9AAPYEJ5nU046NIVt3FTwZFoycZW2PxG+/o/JSXWS6loPnQZkWkTwrIuAcRh1dPlOSDvllGELD4Z7BN4wEVXOFBJtaU+ILlBgncNwQvFIGLF5a6YhG0hGYLaPsA==</ds:SignatureValue>
            <ds:KeyInfo>
               <ds:X509Data>
                  <ds:X509Certificate>MIIEDjCCAvagAwIBAgIUQWL60N8pdoL8VJeC0v2eJV6OL4AwDQYJKoZIhvcNAQEFBQAwVTELMAkGA1UEBhMCVVMxDjAMBgNVBAoMBUFCQllZMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxHzAdBgNVBAMMFk9uZUxvZ2luIEFjY291bnQgOTE1MTcwHhcNMTYwOTA4MDkyNzA3WhcNMjEwOTA5MDkyNzA3WjBVMQswCQYDVQQGEwJVUzEOMAwGA1UECgwFQUJCWVkxFTATBgNVBAsMDE9uZUxvZ2luIElkUDEfMB0GA1UEAwwWT25lTG9naW4gQWNjb3VudCA5MTUxNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3vEVaTlbLjzwJPDpGCKC4TnCbnYMsxwInvKABFF4S21PYHG6M47zkO1MylP89BUXySk8TdeHb1Sd3upSoqGaM3uGd+/kv7KW71QQQG9AtczWom8VfPxju9L9t1bSsMVYjXGROv40H1Q99dGsFraiSvKAKUj5ABY6WdVNaKAU50y7XzbnwCGm65ErLwH4hW+t0wJew/hOWSb9grtKkBWNJN3BUGBOVG9YJD5U4OYGJJaeha/dvh+LpaKG2wT2EZUo/o6789bovh4VaTRqeuVruIyafxzljpOuyHSHu0JarsFqYR45NoMqMEJIbYcA62IeenAANpqwAWIb8+LPGr7YcCAwEAAaOB1TCB0jAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBS+6YWUYqLJeYXS8djijIaLxZlL+TCBkgYDVR0jBIGKMIGHgBS+6YWUYqLJeYXS8djijIaLxZlL+aFZpFcwVTELMAkGA1UEBhMCVVMxDjAMBgNVBAoMBUFCQllZMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxHzAdBgNVBAMMFk9uZUxvZ2luIEFjY291bnQgOTE1MTeCFEFi+tDfKXaC/FSXgtL9niVeji+AMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQUFAAOCAQEAbSP3ubKUVG/Jg6jOGKQ46Rr6nSgP7Sf9zWF6a08eBHXbt3YalPR/ORp9aE+hL82S8QybNxM9fLUcEpRYzZRKysMr1rJ9slCulydCNNlopQN5j+Htfd1tbqINQNNgnnRJnwIHyitREufHQ3Zb9OWWktmyfKjHbtQe+lthCxaIfac6gcPqTIZKgLiTVdnkw/15LvBNkOnjdh6cK1cZF5MF6WdxozgQwvlVQlvh7Bm5UYZ9yQfvtUmOCq+o51cF/gm+VCKCdkeavXL9YZmh6Jk5AcVaF2od29b5rtJSlDbWUnVBFHppVJ2iaWXDHcU0Ms6+hp/LpQG18o4iO9oYw25fXA==</ds:X509Certificate>
               </ds:X509Data>
            </ds:KeyInfo>
         </ds:Signature>
         <saml:Subject>
            <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">maksim_p@abbyy.com</saml:NameID>
            <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
               <saml:SubjectConfirmationData NotOnOrAfter="2016-09-15T09:59:20Z" Recipient="{recipient}" InResponseTo="_1ba6250c-3c4e-49e1-9bff-fc82bc266b34"/>
            </saml:SubjectConfirmation>
         </saml:Subject>
         <saml:Conditions NotBefore="2016-09-15T09:53:20Z" NotOnOrAfter="2016-09-15T09:59:20Z">
            <saml:AudienceRestriction>
               <saml:Audience>{audience}</saml:Audience>
            </saml:AudienceRestriction>
         </saml:Conditions>
         <saml:AuthnStatement AuthnInstant="2016-09-15T09:56:19Z" SessionNotOnOrAfter="2016-09-16T09:56:20Z" SessionIndex="_e5832a70-5d47-0134-7b4f-026cc9f4032d">
            <saml:AuthnContext>
               <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef>
            </saml:AuthnContext>
         </saml:AuthnStatement>
      </saml:Assertion>
   </samlp:Response>
```

サードパーティのID プロバイダーから認証データを取得する方法の詳細については、そのID プロバイダーのドキュメントを参照してください。たとえば、OneLogin では、複数のプログラミング言語で SAML 認証を有効にするための[すぐに使えるツールキット](https://www.onelogin.com/resources/saml-toolkits)を提供しています。

<div id="send-saml-data-to-flexicapture-12-application-server">
  ### SAML データをFlexiCapture 12 Application Serverに送信する
</div>

SAML データをBase64でエンコードし、`https://<Application Server>/Flexicapture12/Server/Saml` にPOSTリクエストを送信してApplication Serverに送ります。SAML データを含むfieldの名前は `SAMLResponse` にする必要があります。

```csharp theme={null}
public static async Task sendSamlToServer( string samlData )
{
    string serviceUrl = "https://<ApplicationServer>/Flexicapture12/Server/SAML";
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create( serviceUrl );
    request.Method = "POST";

    var fields = new Dictionary<string, string>();
    fields.Add( "SAMLResponse", Convert.ToBase64String( Encoding.UTF8.GetBytes( samlData ) ) );
    HttpClient client = new HttpClient();
    FormUrlEncodedContent content = new FormUrlEncodedContent( fields );
    HttpResponseMessage response = await client.PostAsync( serviceUrl, content );
    if( response.StatusCode == HttpStatusCode.OK ) {
        processServerResponse( response.Content.ToString() );
    } else {
        processServerError( response.StatusCode, response.Content.ToString() );
    }
}
```

テナントを使用している場合は、Server URL にテナントの識別子を追加します。例: `https://<ApplicationServer>/Flexicapture12/Server/Saml?Tenant=MyTenantName`

認証を機能させるには、SAML データ内の識別子と一致するログインを持つユーザーが Application Server に登録されている必要があります。`/samlp:Response/saml:Assertion/saml:Subject/saml:NameID` field の値がログインとして使用されます。

Application Server は次のようなレスポンスを返します。

```xml theme={null}
<authTicket>
<userName>maksim_p@abbyy.com</userName> 
       <ticket>82BD00C6601EB7F8EF4265450F934D4103C5CA2F010DE1C5FAB4CC830A82300C743D09E5477279733F283D0B6E1C93ACC30FE353D4D9396649965432AAA7994078C3CC63567A95A35E03DA6FDE020F57</ticket> 
</authTicket>
```

`<ticket>` タグ内の値は、認証済みの FlexiCapture 12 チケットです。このチケットを使用すると、認証が必要なすべての Application Server インターフェイスに対して呼び出しを行うことができます。FlexiCapture のウェブサービスに対するリクエストは、FlexiCapture 認証を使用して送信する必要があります (`https://<ApplicationServer>/flexicapture12/Server/FCAuth/` または `https://<ApplicationServer>/flexicapture12/Server/MobileApp/` で始まるアドレス) 。

<div id="use-the-authenticated-fc-12-ticket">
  ### 認証済みの FC 12 チケットの使用
</div>

cookie ファイル (ファイル名は `FlexiCaptureTmpPrn` である必要があります) または `Authorization: Bearer` ヘッダーを使って、チケットをサーバーに渡せます。例:

```
Authorization: Bearer 82BD00C6601EB7F8EF4265450F934D4103C5CA2F010DE1C5FAB4CC830A82300C743D09E5477279733F283D0B6E1C93ACC30FE353D4D9396649965432AAA7994078C3CC63567A95A35E03DA6FDE020F57
```

ヘッダーを使用することを推奨します。Cookie は、従来のソリューションとの互換性のためにサポートされています。

認証に成功すると、サーバーの応答には、更新されたチケット値が、同じログイン名 (`FlexiCaptureTmpPrn`) の Cookie ファイルと `AuthTicket` ヘッダーの両方に含まれます。次のリクエストは、この更新されたチケットを使用して行う必要があります (チケットは一定時間が経過すると期限切れになります) 。

<div id="set-up-a-trusted-certificate-on-the-application-server">
  ### Application Server で信頼できる証明書を設定する
</div>

Application Server は、ID プロバイダーから受信したデータを検証します。Application Server がこのデータを信頼するには、Application Server の信頼された認証局データベースに含まれる認証局が発行したカスタム証明書で、このデータが署名されている必要があります。

証明書を ABBYY FlexiCapture データベースにインポートします。以後、この証明書を使用してデータが検証されます。詳しくは、[Single Sign-On の設定](/ja/flexi-capture/sso-settings)を参照してください。

検証に失敗した場合、Application Server は `Web.config` ファイルの `<appSettings>` 設定内にある `AllowMixedModeCertificateValidation` パラメーターを参照します。このパラメーターが `true` に設定されている場合、検証は、Application Server を実行しているコンピューターの Local Computer 証明書ストア内の **Trusted Root Certification Authorities** フォルダーに追加された証明書を使用して実行されます。

データベースに証明書が追加されていない場合、検証は **Trusted Root Certification Authorities** フォルダーにある証明書を使用して実行され、`AllowMixedModeCertificateValidation` パラメーターは無視されます。

**プロジェクトおよび付属資料をダウンロードしてください:** [SAML\_Example.zip](SAML_Example.zip)
