質問
これまで、Rally RestapiはSSOログインをサポートしていないことを読んでいます。私はこれは2014年1月現在では真実ではないと思います。同じAPIはExcelのラリーアドインで使用されています(ここは SSOログインをサポートするExcel のラリーアドイン。Rally Restapiを使用してSSOの例を提供してください。
Excel Addinエクスポート機能が何をしているが純粋な.NETアプリケーションで何をしたいのか全く同じことをやりたい。
解決
RallyのようなSSO認証の実行方法を説明するC#REST APIにHOWTOを追加しました。私は便宜上ここに貼り付けています。
感謝、スコット
短時間の集団SSOプライマー
ラリーWebサービスAPI(WSAPI)は、基本認証のみをネイティブにサポートしています。基本認証を使用して、Rallyに直接格納されているユーザー名とパスワードのリストに対して検証されたユーザー名とパスワードでWSAPIセッションを開始する必要があります。これは、クライアントがシングルサインオン(SSO)の使用を開始するまでうまく機能します。 SSOでは、クライアントは単一の企業全体の認証メカニズム(LDAPまたはActive Directoryなど)を使用してユーザー認証情報とパスワードを管理できます。これまでは、SSOを有効にしたWSAPIを使用すると、Rally WSAPIを使用したいすべてのユーザーに対して、重複ユーザーリスト(「白い」リスト)を維持するためにクライアントが必要です。 Rallyの最近の変更により、WSAPIユーザーが自分のSSO認証情報を使用してRallyにアクセスし、それらのユーザーを「ホワイト」リストに維持する必要性を軽減できるようになりました。
注:ラリーの現在のSSO実装は、ブラウザと対話して認証を完了するためにユーザーが対話する必要があるSAML仕様に基づいています。そのため、このテクニックはユーザーがブラウザと対話することを要求しているため、VCSやバグ追跡ツールでラリーを同期させるものなど、ヘッドレスWSAPIクライアントと互換性がありません。
SSO接続を開始するとき、ユーザは、後でクライアントのIDプロバイダ(IDP)を含むRallyのサービスプロバイダ(IDP)を含むSSOハンドシェイクを開始するURLを提供し、有効な認証されたセッションを表すCookieでRally Resplicsで終了します。 。その認証されたセッションCookieがそれ以降のWSAPI呼び出しに含まれている場合、Rallyは認証されたユーザーでそれらの呼び出しを関連付け、WSAPI呼び出しは認証されます。 SAML SSO認証を成功させるためにWSAPI呼び出しの目的で認証されたセッションCookieへのアクセスを容易にするために、存在する場合にはSESSION Cookieを含む特別なWebページを返却する最初のSSO URLに追加されたパラメータを検索します。 SSOハンドシェイクの最終製品としてのテキスト。ユーザーはそのデータを使用して、後続のWSAPI呼び出しで使用されるクッキーを構築できます。
注:以下の例のURLは、Rallyの内部SSO実装に固有のものです。 SSOは、独自のSSOインフラストラクチャ(少なくともIDP部門)を使用して自分の認証を提供できるようにするために使用されているため、SSO URLは顧客固有になります。 Rally TamまたはSSO URLのヘルプをサポートするために連絡してください。
元のSSO URLは次のようになります。
https://sso.rallydev.com/sp/startSSO.ping?PartnerIdpId=pingidp.f4tech.com-29577
.
特殊パラメータは次のとおりです。
TargetResource=https://us1.rallydev.com/slm/j_sso_security_check?noRedirect=true
.
注:この名前/ valueペアは、PingIdentityを使用してSSOプロバイダとしてのRallyの特定のSSO実装でSSO RelayStateを設定します。他のSSOプロバイダは、RelayStateを設定するために使用される異なるパラメータ名を持つことができます。たとえば、一部のSSOプロバイダは、relayStateをパラメータ名として使用します。いずれにせよ、値は常に同じです(つまり、 " https://us1.rallydevです。 com / slm / j_sso_security_check?noredirect= true ")
だから完全なURLは次のようになります。
https://sso.rallydev.com/sp/startSSO.ping?PartnerIdpId=pingidp.f4tech.com-29577&TargetResource=https://us1.rallydev.com/slm/j_sso_security_check?noRedirect=true
.
認証後にユーザーがこの変更されたSSO URLに移動した場合、それらは次のものを含むWebページで提示されます。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>SSO Token</title>
</head>
<body>
<form>
<input type="hidden" name="authCookieName" value="ZSESSIONID"/>
<input type="hidden" name="authCookieValue" value="khkjhkhkhkhkjhh"/>
</form>
</body>
</html>
.
このページに含まれるデータに基づいてユーザーがクッキーを作成し、そのクッキーを後続のWSAPI呼び出しとともに渡します。これらの呼び出しは正常に認証されます。 SecureとPathのようなオプションのCookieデータは、CookieのIETF仕様に従ってCookieを取得するためにCookieから推測されなければならないことに注意してください。
そのため、GUIインタフェースからRallyにログインするための基本プロセス(再びヘッドレス環境では機能しません)WSAPI呼び出しを発行することは、次のとおりです。
- 上記の特別なパラメータを使用して、ユーザーからSSO URLを集めます。
- そのURLを指すブラウザを起動します。
- ナビゲート後、返されたHTMLページからCookie値を削除します。
- ブラウザを閉じます。
- Cookie値からCookieを作成します。
- 後で使用するためにそのクッキーを保管してください。
- それ以降のすべてのWSAPI呼び出しでそのクッキーを送ります。
このCookieを使用した認証に障害が発生した場合は、このプロセスを繰り返します。これらのCookieが期限切れになり、再認証後に失敗したコールを再試行する準備をしてください。
ラリーC#REST API
Rally C#REST APIには、セッションタイムアウト後の自動再認証を含むさまざまなGUIクライアントが異なるGUIクライアントが容易になるように接続フレームワークに統合されたメカニズムがあります。これには、トークンページを有効なCookieに解析する方法が含まれます。このライブラリの発信者は他のFEAを実装できます
セールス(テスト環境のようなドメイン、パス、セキュア、およびホストポートのような)を推測するなどの競争(テスト環境のような)Cookieデータを完全に返さない。C#REST APIを使用してRallyRestAPIのインスタンスを構築することを意味します。基本認証を想定し、他のパラメータの中でユーザー名とパスワードを取る2つのレガシーコンストラクタがあります。これらのコンストラクタの1つを使用してRallyRestapiを構築することは常に基本認証を使用し、SSOを使用することは決してありません。
第3のコンストラクタはIconNectionInfoオブジェクトのみを取ります。これがRallyRestapiを得るための好ましい方法です。 IconNectionInfoオブジェクトを使用してRallyRestAPIを構築することで、呼び出し側は、複数のRallyRestapiインスタンス間のSSOコールバックおよび認証共有に使用できる1つのオブジェクト内のすべての接続情報を指定できます。
IconNectionInfoとConnectionInfo
SSO認証を容易にするために、C#REST APIはIconNectionInfoインタフェースとConnectionInfoクラスを導入しました。これらのクラスは、接続の設定を保持し、それを要求されたときにブラウザベースのSSO認証セッションを開始および完了できるオブジェクトを表します。 ConnectionInfoクラスはすべての接続設定を実装し、ラリーSSOランディングページを使用可能なクッキーに解析する方法を持っています。基本認証のみが必要な場合は、このクラスをそのまま使用できます。 CallerがConnectionInfoを拡張したり使用したりしたくない場合は、iconEctionInfoが柔軟になります。
Basic AuthにIconNectionInfoを使用する場合は、新しいConnectionInfoを作成し、適切な公開されているフィールドを設定するだけです。 RallyRestapiを構築するためにそれを使用してください。認証エラーが例外をスローします。
Example:
var cInfo = new ConnectionInfo();
cInfo.UserName = "myName";
cInfo.Password = "pass";
cInfo.Server = new Uri("https://host.com");
cInfo.AuthType = Rally.RestApi.AuthorizationType.Basic;
var conn = new RallyRestApi(cInfo);
.
SSOにIconNectionInfoを使用する場合、呼び出し元はdossoauth()を実装する必要があります。以下は注釈付き例です。
public class MyConnectionInfo : Rally.RestApi.ConnectionInfo
{
public override void doSSOAuth()
{
// Launch a browser to the this.server URI.
// The browser will close automatically if it successfully reaches the SSO landing page
// Users can cancel the SSO handshake
// Abort if the handshake is successful, but didn't arrive at the SSO landing page
var ssoDialog = new SSOAuthDialog(server);
DialogResult result = ssoDialog.ShowDialog();
if (result == DialogResult.Cancel)
throw new Exception("SSO authorization canceled");
else if (result == DialogResult.Abort)
throw new Exception(ssoDialog.abortReason);
// Parse the SSO landing page into a Cookie and save it
AuthCookie = parseSSOLandingPage(ssoDialog.getBrowser().DocumentText);
// Infer Cookie values from SO Landing Page URL if not set
if (String.IsNullOrWhiteSpace(authCookie.Domain) || authCookie.Domain == "null")
authCookie.Domain = ssoDialog.getBrowser().Url.Host;
AuthCookie.Secure = String.Equals(ssoDialog.getBrowser().Url.Scheme,"https",StringComparison.InvariantCultureIgnoreCase);
// Set a specific port port if the SSO Landing Page URL has one
if (!ssoDialog.getBrowser().Url.IsDefaultPort)
Port = ssoDialog.getBrowser().Url.Port;
}
}
.
この例では、ブラウザコンポーネントを使用してWinFormsダイアログを使用してSSOハンドシェイクをユーザーに提示します。覚えておいてください、あなたはこの部分を実装したいディスプレイテクノロジを使うことができます。これは注釈付き例です:
public partial class SSOAuthDialog : Form
{
public String abortReason;
public SSOAuthDialog(Uri url)
{
InitializeComponent();
webBrowser.Url = url;
}
private void documentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
// We have found the SSO Landing Page.
if (webBrowser.DocumentText.Contains("authCookieName") && webBrowser.DocumentText.Contains("authCookieValue"))
{
Trace.TraceInformation("Found SSO authentication token on page: {0}", e.Url.AbsolutePath);
DialogResult = DialogResult.OK;
Close();
}
// We have landed on the Rally ALM page
// This is usually caused by a bad URL
else if (webBrowser.DocumentText.Contains("window.FEATURE_TOGGLES"))
{
abortReason = String.Format("The SSO handshake was successful, but the 'RelayState' was not correctly set. Contact your administrator to obtain the correct URL parameter to set the SSO handshake 'RelayState' to: https://rally1.rallydev.com/slm/j_sso_security_check?noRedirect=true");
Trace.TraceError(abortReason);
DialogResult = DialogResult.Abort;
Close();
}
}
public WebBrowser getBrowser()
{
return webBrowser;
}
}
SSO Example:
var cInfo = new MyConnectionInfo();
cInfo.Server = new Uri("https://host");
cInfo.AuthType = Rally.RestApi.AuthorizationType.SSO;
// This will cause an SSO authentication event
var conn = new RallyRestApi(cInfo);
// This will not b/c it will just use the auth Cookie already in cInfo
var conn2 = new RallyRestApi(cInfo);
.
SSOにIconNectionInfoを使用する場合、RallyRestapiを構築するために送信したIconNectionInfoオブジェクトをキャッシュすることが重要です。 SSOハンドシェイクが成功した後、結果のAUTH CookieはIconNectionInfoオブジェクトに保存され、そのRallyRestAPIオブジェクトから作成されたすべてのWSAPI呼び出しに使用されます。以前に成功したSSOログインから同じAUTH Cookieを使用して別のRallyRestapiオブジェクトを作成する必要がある場合は、同じIconNectionInfoオブジェクトを持つ新しいRallyRestapiオブジェクトを構築し、Auth Cookieが存在する場合は使用されます。
再試行
承認クッキーは期限切れになる可能性があります。 C#REST APIは期限切れのSSO Cookieを検出し、新しい有効なCookieを入手するために必要に応じて新しいSSOログインセッションを開始します。
それがすべてそこにあることです。
他のヒント
SSOは現在ツールキットでサポートされていません。Excelプラグインのために働くためにいくつかの特別なハックを使いますが、私たちの開発者コミュニティと共有するのに十分なユーザーフレンドリーなインターフェースで何もありません。
私たちはOAuthソリューションで取り組んでいます。それが出荷すると、それが持っている機能を示すためにブログを公開する必要があります。私の個人的な希望は、私たちのツールキットのすべてがOAuth Simpleを使って作るのをサポートすることです。