認証プロセスの概要
SAML認証は、第三者のIDプロバイダを使用することで (例:GoogleもしくはFacebook)、ABBYY FlexiCapture 12ユーザーが認識データ(例えばユーザーネームやパスワードなど)をFlexiCaptureのアプリケーションサーバーコンポーネントへ送信しないようにします。そして信頼できる第三者からアプリケーションサーバーへの安全な認証に関するデータを送信します。
ユーザーアプリケーション上でのSAML認証プロセスは以下の通りです:
- 第三者のIDプロバイダによる認証
- ユーザーのSAML認証データを第三者のIDプロバイダから取得
- SAML認証データをアプリケーションサーバーに送信
- 認証チケットをアプリケーションサーバーから取得
その後、アプリケーションサーバーからの要求に当該チケットが使用できるようになります。
注:FlexiCaptureデータベースにユーザーアカウントが存在している必要があり、必要なすべての許可を持っていなければなりません。
実装
SAMLデータの取得
第三者のIDプロバイダからのSAMLデータは以下のようなフォーマットです(この例はOneLoginからのものです):
<?xmlversion="1.0"encoding="UTF-8"?>
<samlp:Responsexmlns: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:StatusCodeValue="urn:oasis:names:tc:SAML:2.0:status:Success"/></samlp:Status>
<saml:Assertionxmlns: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:Signaturexmlns:ds="https://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethodAlgorithm="https://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethodAlgorithm="https://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:ReferenceURI="#pfx5b0edaf1-7296-f635-b387-a964c92e4d5f">
<ds:Transforms>
<ds:TransformAlgorithm="https://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:TransformAlgorithm="https://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transforms>
<ds:DigestMethodAlgorithm="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:NameIDFormat="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">maksim_p@abbyy.com</saml:NameID>
<saml:SubjectConfirmationMethod="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<saml:SubjectConfirmationDataNotOnOrAfter="2016-09-15T09:59:20Z"Recipient="{recipient}"InResponseTo="_1ba6250c-3c4e-49e1-9bff-fc82bc266b34"/>
</saml:SubjectConfirmation>
</saml:Subject>
<saml:ConditionsNotBefore="2016-09-15T09:53:20Z"NotOnOrAfter="2016-09-15T09:59:20Z">
<saml:AudienceRestriction>
<saml:Audience>{audience}</saml:Audience>
</saml:AudienceRestriction>
</saml:Conditions>
<saml:AuthnStatementAuthnInstant="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データをFlexiCapture12アプリケーションサーバーに送信
POSTリクエストをhttps://<Application Server>/Flexicapture12/Server/Saml.に作成することで、Base64のSAMLデータをエンコードし、アプリケーションサーバーに送信する。SAMLデータSAMLレスポンスを含むフィールド名称を設定
public static async Task sendSamlToServer( string samlData )
{
string serviceUrl = "https://<Application Server>/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データ内の識別子が一致したユーザーが、アプリケーションサーバーで登録をする必要があります。 /samlp:Response/saml:Assertion/saml:Subject/saml:NameIDフィールドの値がログインに使用されます。
アプリケーションサーバーは以下のようなレスポンスを返します:
<authTicket>
<ユーザー名>UserName</userName>
<ticket>82BD00C6601EB7F8EF4265450F934D4103C5CA2F010DE1C5FAB4CC830A82300C743D09E5477279733F283D0B6E1C93ACC30FE353D4D9396649965432AAA7994078C3CC63567A95A35E03DA6FDE020F57</ticket>
</authTicket>
<ticket> タグ内の値はFC12チケットにより認証されます。すべての認証を要求するアプリケーションサーバーインターフェイスにアクセスするためにこのチケットを使用できます。FlexiCaptureウェブサービスに対する要求はFlexiCapture認証 (addresses starting with https://<ApplicationServer>/flexicapture12/Server/FCAuth/ or https://<ApplicationServer>/flexicapture12/Server/MobileApp/)を使用して行われなければなりません。
認証されたFC12チケットを使用
クッキーファイルを使用することでチケットをサーバーに送信出来ます。(ファイルはFlexiCaptureTmpPrnという名前でなければなりません)もしくは認証:送信者ヘッダー例:
認証:Bearer 82BD00C6601EB7F8EF4265450F934D4103C5CA2F010DE1C5FAB4CC830A82300C743D09E5477279733F283D0B6E1C93ACC30FE353D4D9396649965432AAA7994078C3CC63567A95A35E03DA6FDE020F57
このヘッダーを使用することを推奨します。クッキーは旧ソリューションとの互換性を維持するためにサポートされています。
認証が成功した場合、サーバーレスポンスはアップデートされたチケットの値を同一ログインのクッキーファイル(FlexiCaptureTmpPrn)とAuthTIcketヘッダーを含みます。次の要求はアップデートされたチケットを使用して行われなければなりません(一定時間が経つとチケットは無効となります)。
アプリケーションサーバーで信頼できる認証を確立する。
アプリケーションサーバは、識別プロバイダーから受け取ったデータを確認します。アプリケーションサーバーがこのデータを信頼するには、信頼できる機関のアプリケーションサーバーデータベースから機関によって発行されたカスタム証明書で署名する必要があります。
証明書を ABBYY FlexiCapture データベースにインポートします。これで、この証明書を使ってデータをチェックします。詳しくは、シングルサインオンの設定をご覧ください。
チェックに失敗した場合、アプリケーションサーバー は Web.config ファイル内の<appSettings>設定で AllowMixedModeCertificateValidationパラメータを参照します。このパラメータがtrueに設定されている場合、アプリケーションサーバーを実行しているコンピュータのローカルコンピュータ証明書ストアの信頼できるルート証明機関フォルダに追加された証明書を使用してチェックが行われます。
データベースに証明書が追加されていない場合は、信頼できるルート証明機関フォルダにある証明書を使用してチェックが行われ、AllowMixedModeCertificateValidation パラメータは無視されます。
プロジェクトと添付資料をダウンロードします:SAML_Example.zip