SAML 認証を使用すると、ABBYY FlexiCapture 12 のユーザーは、サードパーティの ID プロバイダー (Google や Facebook など) で認証を行い、その後、信頼できるサードパーティから認証成功に関するデータを Application Server に渡すことで、ユーザー名やパスワードなどの ID 情報を FlexiCapture の Application Server コンポーネントに送信せずに済みます。
ユーザーアプリケーションにおける SAML 認証プロセスは、次の手順で構成されます。
- サードパーティの ID プロバイダーで認証する
- サードパーティの ID プロバイダーからユーザーの SAML 認証データを取得する
- SAML 認証データを Application Server に送信する
- Application Server から認証済みチケットを受け取る
このチケットは、その後、Application Server へのリクエストで使用できます。
ユーザーアカウントは FlexiCapture データベース内に存在し、必要な権限をすべて持っている必要があります。
サードパーティのID プロバイダーから取得した SAML データは、次の形式になります(この例は OneLogin のものです):
<?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 認証を有効にするためのすぐに使えるツールキットを提供しています。
SAML データを FlexiCapture 12 Application Server に送信する
SAML データを Base64 でエンコードし、https://<Application Server>/Flexicapture12/Server/Saml に POST リクエストを送信して、Application Server に送信します。SAML データを含む field の名前は SAMLResponse である必要があります。
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() );
}
}
テナントを使用している場合は、サーバー URL にテナントの識別子を追加します。例: https://<ApplicationServer>/Flexicapture12/Server/Saml?Tenant=MyTenantName
認証を機能させるには、SAML データ内の識別子と一致するログインを持つユーザーが Application Server に登録されている必要があります。/samlp:Response/saml:Assertion/saml:Subject/saml:NameID field の値がログインとして使用されます。
Application Server は以下のような応答を返します。
<authTicket>
<userName>maksim_p@abbyy.com</userName>
<ticket>82BD00C6601EB7F8EF4265450F934D4103C5CA2F010DE1C5FAB4CC830A82300C743D09E5477279733F283D0B6E1C93ACC30FE353D4D9396649965432AAA7994078C3CC63567A95A35E03DA6FDE020F57</ticket>
</authTicket>
<ticket> タグ内の値が、認証済みの FlexiCapture 12 チケットです。このチケットは、認証が必要なすべての Application Server インターフェイスの呼び出しに使用できます。FlexiCapture Web サービスへのリクエストは、FlexiCapture 認証を使用して行う必要があります (https://<ApplicationServer>/flexicapture12/Server/FCAuth/ または https://<ApplicationServer>/flexicapture12/Server/MobileApp/ で始まるアドレス) 。
cookie ファイル (ファイル名は FlexiCaptureTmpPrn である必要があります) または Authorization: Bearer ヘッダーを使って、チケットをサーバーに渡せます。例:
Authorization: Bearer 82BD00C6601EB7F8EF4265450F934D4103C5CA2F010DE1C5FAB4CC830A82300C743D09E5477279733F283D0B6E1C93ACC30FE353D4D9396649965432AAA7994078C3CC63567A95A35E03DA6FDE020F57
ヘッダーを使用することを推奨します。Cookie は、従来のソリューションとの互換性のためにサポートされています。
認証に成功すると、サーバーの応答には、更新されたチケット値が、同じログイン名 (FlexiCaptureTmpPrn) の Cookie ファイルと AuthTicket ヘッダーの両方に含まれます。次のリクエストは、この更新されたチケットを使用して行う必要があります (チケットは一定時間が経過すると期限切れになります) 。
Application Server で信頼できる証明書を設定する
Application Server は、ID プロバイダーから受信したデータを検証します。Application Server がこのデータを信頼するには、Application Server の信頼された認証局データベースに含まれる認証局が発行したカスタム証明書で、このデータが署名されている必要があります。
証明書を ABBYY FlexiCapture データベースにインポートします。以後、この証明書を使用してデータが検証されます。詳しくは、Single Sign-On の設定を参照してください。
検証に失敗した場合、Application Server は Web.config ファイルの <appSettings> 設定内にある AllowMixedModeCertificateValidation パラメーターを参照します。このパラメーターが true に設定されている場合、検証は、Application Server を実行しているコンピューターの Local Computer 証明書ストア内の Trusted Root Certification Authorities フォルダーに追加された証明書を使用して実行されます。
データベースに証明書が追加されていない場合、検証は Trusted Root Certification Authorities フォルダーにある証明書を使用して実行され、AllowMixedModeCertificateValidation パラメーターは無視されます。
プロジェクトおよび付属資料をダウンロードしてください: SAML_Example.zip