この記事では、PowerShellを使用してSAML 2.0のAuthnRequest(認証要求)XMLを動的に構築し、Base64エンコードした上でIdPへ送信するサンプルスクリプトと手順について解説します。
想定環境・前提条件
- Windows PowerShell 5.1 または PowerShell 7以降
- SAML 2.0に対応するIdP(Identity Provider)およびSP(Service Provider)の環境設定情報
SAMLメッセージの概要
SAML(Security Assertion Markup Language)認証で使用される主要なメッセージには、以下のようなものがあります。
- AuthnRequest:認証要求を表すメッセージで、ユーザーがアプリケーションにアクセスするときに最初に送信されます。
- Response:IdPからSPに送信される、認証の成功または失敗に応じた応答メッセージです。
- LogoutRequest:ユーザーのログアウト要求を表すメッセージです。
- LogoutResponse:ログアウト要求に対する応答メッセージです。
PowerShellによるAuthnRequest構築・送信スクリプト
以下は、AuthnRequestのXMLを組み立て、Base64エンコードしたうえでHTTP POSTリクエストを送信する最小限の実行例です。
# SAML AuthnRequestメッセージのXMLを構築する関数
function Build-SamlAuthnRequestXml {
param(
[Parameter(Mandatory=$true)]
[string]$issuer,
[Parameter(Mandatory=$true)]
[string]$assertionConsumerService,
[Parameter(Mandatory=$true)]
[string]$destination
);
$id = [System.Guid]::NewGuid().ToString();
$issueInstant = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ");
$requestXml = @"
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
ID="$id"
Version="2.0"
IssueInstant="$issueInstant"
AssertionConsumerServiceURL="$assertionConsumerService"
Destination="$destination"
ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
Issuer="$issuer">
<saml:Issuer>$issuer</saml:Issuer>
</samlp:AuthnRequest>
"@;
return $requestXml;
}
# 接続先情報の定義
$issuer = "https://example.com/sp";
$assertionConsumerService = "https://example.com/sp/acs";
$destination = "https://example.idp.com/sso/saml2";
# XMLの構築
$requestXml = Build-SamlAuthnRequestXml -issuer $issuer -assertionConsumerService $assertionConsumerService -destination $destination;
# Base64エンコード
$requestBase64 = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($requestXml));
# HTTP POST送信の実行例
$response = Invoke-WebRequest -Uri $destination -Method POST -Body @{ "SAMLRequest" = $requestBase64 };
Write-Output $response.StatusCode;
期待される結果
正常にリクエストが送信された場合、IdP側で認証画面が起動するか、ステータスコード 200 などの応答が返されます。環境に応じて証明書の検証や署名(Signature)の付与が必要になる点にご注意ください。
この記事の更新履歴
この記事は、生成AIを活用した自動レビュー・更新フローにより内容を見直し、必要な修正を反映しています。
2026年9月12日
- 変更画面上で正しくコードや見出しが表示されるように全体の見出し構造とコードブロックを修正しました。
- 追加この記事でできること、前提条件、実行手順、期待される出力を追加しました。

