2011年7月8日金曜日

[ACSv2] Powershell で ACS を管理する

久しぶりのポストとなってしまいました。

以前 OpenID Provider を ACSv2 に登録するための GUI クライアントを公開しました。
http://idmlab.eidentity.jp/2011/03/acsv2openid-provider.html
http://idmlab.eidentity.jp/2011/04/acsv2-openid.html

その後 ACSv2 が正式にリリースされたことを受けてラボ版とは別に正式リリース版の ACSv2 用の GUI を含め以下のURLで公開をしました。(5月の初めにリリースしましたが blog に書くのを忘れてました)
http://sourceforge.net/projects/acsv2management/files/

ラボ用:ACSv2_Config.ZIP
正式リリース用:ACSv2_Config_for_Prod.zip


そんな中、これも少し前になりますが Vittorio が CodePlex に PowerShell のコマンドレットを公開しています。
http://blogs.msdn.com/b/vbertocci/archive/2011/05/17/announcing-sample-acs-cmdlets-for-the-windows-azure-appfabric-access-control-service.aspx
http://wappowershell.codeplex.com/releases/view/66308#DownloadId=240649



ACSv2 が正式にリリースされた時にも書きましたが結局 OpenID Provider をサポートした、と言っても Web の管理画面から管理をすることが出来ないので、上記 GUI や Powershell を使って ACS の Management Service を直接操作するしか方法がありません。

GUI の操作は以前紹介したので、今回は PowerShell のコマンドレットを使って ACS を操作する方法を紹介します。


■ ACS の Management Service の基本概念
その前にまずは ACS の Management Service を操作するときの基本的な考え方を整理しておきます。

基本は WCF Data Services を使って ACS Management Service を操作するので、サービス参照をしてクライアントを生成して用意された API を実行していく、というスタイルです。

また、サービスを使う際は ACS の Management Service 用のユーザとパスワードで事前に認証を受けておきます。
流れは、
1.認証:[マネージメントサービスのエンドポイント]/v2/OAuth2-13 へユーザ名とパスワードを POST し、 SWT(Simple Web Token)を取得する
2.認可:取得した SWT を HTTP の Authorization ヘッダに Bearer トークンとして付加してアクセス
です。

その後は実際のメソッドを実行して各種操作(例えば作成した IdP に RP を紐付ける場合であれば AddToRelyingPartyIdentityProviders )を行う、という形です。


■ Powershell コマンドレットのセットアップ
ただ、毎回これを実行するのはかなり面倒なので、上述の GUI や Powershell が活躍するわけです。今回は Powershell 版の使い方です。

まずは CodePlex からダウンロードしたモジュールをセットアップしますが、前提となるソフトウェアは、
・Powershell
・.NET Framework 3.5 SP1
・Windows Identity Foundation Runtime
・ADO.NET Data Services Update for .NET Framework 3.5 SP1
です。

これらがインストールされているマシンにダウンロードしたモジュールを解凍、セットアップファイルを実行するとコマンドレッドが組み込まれます。

(セットアップ画面)














■ 用意されているコマンドレッド
以下のコマンドレットが用意されています。Web 画面を知っていれば各パラメータが何を指しているのかは理解できると思います。
利用するときは Add-PSSnapin ACSManagementToolsSnapIn を実行してスナップインを組み込みます。

種別コマンドレット名概要引数説明
共通Get-AcsManagementTokenManagementServiceへアクセスするためのトークンを取得する-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
IdPAdd-IdentityProviderIdentity Providerを追加する-type定義済みかカスタムか
-PreconfiguredIpType定義済みの場合のタイプ
-NameIdP名
-AllowedRelyingParties紐付けるRP
-LoginLinkTextホームレルムディスカバリ時のリンク文字列
-FbAppIdFacebookの場合のApplicationID
-FbAppSecretFacebookの場合のApplicationSecret
-WsFederationMetadataws-federationのmetadata
-Protocolプロトコル
-SignInAddressサインインアドレス
-SigningCertificateトークン署名の証明書
-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
Get-IdentityProviderIdentity Provider情報を取得する-Name取得対象のIdP名
-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
Get-IdentityProviders登録されている全Identity Provider情報を取得する-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
Remove-IdentityProviderIdentity Providerを削除する-Name削除対象のIdP名
-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
RPAdd-RelyingPartyRelying Partyを追加する-NameRP名
-RealmACSがトークンを発行する先のURI
-ReturnUrlACSがトークンを返却する先のURI
-ErrorUrlエラーが発生した時のリダイレクト先URI
-TokenFormatACSが発行するトークンのフォーマット(種類)
-TokenLifetimeトークンの有効期間
-AllowedIdentityProviders紐付けるIdP
-RuleGroupName紐付けるRuleGroup名
-SigningSymmetricKeyトークン署名の対象鍵
-SigningCertトークン署名の証明書
-EncryptionCertトークン暗号化の証明書
-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
Get-RelyingPartyRelying Party情報を取得する-Name取得対象のRP名
-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
Get-RelyingParties登録されている全Relying Party情報を取得する-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
Remove-RelyingPartyRelying Partyを削除する-Name削除対象のRP名
-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
RuleAdd-DefaultPassThroughRulesデフォルトのパススルールールを追加する-GroupName対象のグループ名
-IdentityProviderName対象のIdP名
-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
Add-Ruleルールを追加する-GroupName対象のグループ名
-Description説明
-IdentityProviderName対象のIdP名
-InputClaimType入力クレームのタイプ
-InputClaimValue入力クレームの値
-OutputClaimType出力クレームのタイプ
-OutputClaimValue出力クレームの値
-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
Get-Ruleルール情報を取得する-Id取得対象ルールのID
-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
Get-Rules登録されている全ルール情報を取得する-GroupName対象のグループ名
-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
Remove-Ruleルールを削除する-Rule削除対象のルール名
-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
Rule GroupAdd-RuleGroupルールグループを追加する-Nameルールグループ名
-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
Get-RuleGroupルールグループ情報を取得する-Name取得対象のルールグループ名
-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
Get-RuleGroups登録されている全ルールグループ情報を取得する-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
Remove-RuleGroupルールグループを削除する-Name削除対象のルールグループ名
-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
CryptoAdd-TokenEncryptionKeyトークン暗号化キーの追加-Nameキー名
-Certificate証明書
-RelyingPartyNameRP名
-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
Add-TokenSigningKeyトークン署名キーの追加-Nameキー名
-Key証明書パスワード
-EffectiveDate開始日
-ExpirationDate有効期限
-Certificate証明書
-MakePrimaryプライマリ設定
-RelyingPartyNameRP名
-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
Get-ServiceKeyサービスキー情報を取得する-Nameキー名
-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
Get-ServiceKeys登録されている全サービスキー情報を取得する-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン
Remove-ServiceKeyサービスキーを削除する-Nameキー名
-NameSpaceACSv2のネームスペース名
-ManagementKeyManagement Service用のパスワード
-MgmtTokenGet-AcsManagementTokenで取得したトークン




■ 利用例
登録されている IdP 一覧を取得してみます。

SnapInの組み込みPS C:\Windows\system32> Add-PSSnapin ACSManagementToolsSnapIn;
定数(ネームスペース、パスワード)の登録PS C:\Windows\system32> $acsNamespace = "sso-test";
PS C:\Windows\system32> $mgmtKey = "xxxx";
アクセストークンの取得PS C:\Windows\system32> $mgmtToken = Get-AcsManagementToken -namespace $acsNamespace -managementKey $mgmtKey;
IdP一覧の取得PS C:\Windows\system32> Get-IdentityProviders -MgmtToken $mgmtToken
結果Id : 10000009
Name : Windows Live ID
Realm : https://accesscontrol.windows.net/
WebSSOProtocolType : WsFederation
LoginLinkName : Windows Live? ID
IssuerName : uri:WindowsLiveID
SignInEndpoint : https://login.live.com/login.srf
SignOutEndpoint :
EmailDomain :
ImageUrl :
FedMetadataUrl : https://nexus.passport.com/federationmetadata/2007-06/federationmetadata.xml
ClaimTypes : {}
Keys : {Windows Live ID Signing Key, Windows Live ID Signing Key}
RelyingParties : {}
MgmtToken : http%253a%252f%252fschemas.microsoft.com%252fws%252f2008%252f06%252fidentity%252fclaims%252frole%3
dAdministrator%26http%253a%252f%252fschemas.microsoft.com%252faccesscontrolservice%252f2010%252f07
%252fclaims%252fidentityprovider%3dhttps%253a%252f%252fsso-test.accesscontrol.windows.net%252f%26A
udience%3dhttps%253a%252f%252fsso-test.accesscontrol.windows.net%252fv2%252fmgmt%252fservice%252f%
26ExpiresOn%3d1310076551%26Issuer%3dhttps%253a%252f%252fsso-test.accesscontrol.windows.net%252f%26
HMACSHA256%3dBKS2yqeR11sE%252fBj5wzoxSUY41mwMhMwfUb7ThCZ9bO4%253d
SystemReserved : True



いかがでしょうか?
一括登録や Web の管理画面では登録できないようなカスタムプロバイダを登録する場合など、コマンドラインで操作できると非常に楽ですね。

0 件のコメント: