如何使用 Rally.RestApi.dll 进行单点登录?

2023-12-05

到目前为止,我了解到 Rally RestAPI 不支持 SSO 登录。我相信从 2014 年 1 月开始,情况已不再如此。Rally Add-in for Excel 中使用了相同的 API(这里是链接Excel 的 Rally 插件)支持SSO登录。我可以获取 Rally Excel 插件的源代码吗?或者至少有人可以提供使用 Rally RestAPI 的 SSO 示例吗?

我想要做与 Excel Addin Export 功能完全相同的事情,但想要在纯 .net 应用程序中做。


我在 C# Rest Api 中添加了一个操作指南,解释了如何像 Excel 插件中的 Rally 那样进行 SSO 身份验证。为了方便我把它贴在这里。

谢谢,斯科特

Rally SSO 简介

Rally Web 服务 API (WSAPI) 本身仅支持基本身份验证。使用基本身份验证,WSAPI 会话必须使用用户名和密码启动,该用户名和密码根据直接存储在 Rally 中的用户名和密码列表进行验证。在客户端开始使用单点登录 (SSO) 之前,这种方法可以正常工作。 SSO 允许客户端使用单一企业范围的身份验证机制(如 LDAP 或 Active Directory)来管理用户凭据和密码。到目前为止,使用启用了 SSO 的 WSAPI 要求客户端在 Rally 中为所有希望使用 Rally WSAPI 的用户维护一个重复的用户列表(“白”列表)。最近对 Rally 的更改现在允许 WSAPI 用户使用其 SSO 凭据访问 Rally,并减轻了将这些用户保留在“白”列表中的需要。

注意:Rally 当前的 SSO 实现基于 SAML 规范,该规范要求用​​户与浏览器交互才能完成身份验证。因此,该技术需要用户与浏览器交互,因此它与无头 WSAPI 客户端(例如那些将 Rally 与 VCS 和错误跟踪工具同步的客户端)不兼容。

启动 SSO 连接时,用户提供一个 URL,该 URL 开始与 Rally 的服务提供商 (SP) 进行 SSO 握手,随后涉及客户端的身份提供商 (IdP),并以 Rally 响应表示有效的经过身份验证的会话的 cookie 结束。如果该经过身份验证的会话 cookie 包含在任何后续 WSAPI 调用中,Rally 会将这些调用与经过身份验证的用户关联起来,并且 WSAPI 调用将得到身份验证。为了在成功的 SAML SSO 身份验证后轻松访问经过身份验证的会话 cookie 以进行 WSAPI 调用,Rally 会查找添加到初始 SSO URL 的参数,如果存在该参数,将返回一个包含明文会话 cookie 的特殊网页文本作为 SSO 握手的最终结果。用户可以使用该数据构建一个 cookie,以便在后续 WSAPI 调用中使用。

注意:下面的示例 URL(可能)特定于 Rally 的内部 SSO 实现。由于 SSO 用于允许客户使用自己的 SSO 基础设施(至少是 IdP 部分)提供自己的身份验证,因此 SSO URL 将是特定于客户的。请联系您的 Rally TAM 或 Rally 支持以获得有关 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

注意:此名称/值对使用 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,则在身份验证后,他们将看到一个包含以下内容的网页:

<!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>

如果用户根据此页面中包含的数据创建 cookie,并将该 cookie 与其后续 WSAPI 调用一起传递,则这些调用将成功通过身份验证。请注意,必须根据 IETF cookie 规范从获取 cookie 的调用中推断出安全和路径等可选 cookie 数据。

因此,从 GUI 界面登录 Rally(同样,这不适用于无头环境)以发出 WSAPI 调用的基本过程如下:

  • 使用上述特殊参数从用户收集 SSO URL。
  • 启动指向该 URL 的浏览器。
  • 导航完成后,从返回的 HTML 页面中抓取 cookie 值。
  • 关闭浏览器。
  • 根据 cookie 值构造 cookie。
  • 存储该 cookie 以供以后使用。
  • 将该 cookie 与所有后续 WSAPI 调用一起发送。

如果 WSAPI 调用使用此 cookie 进行身份验证失败,请重复此过程。请记住,这些 cookie 会过期,您应该准备好在重新身份验证后重试失败的呼叫,以创建流畅的用户体验。

Rally C# ReST API

Rally C# Rest API 的连接框架中集成了一种机制,使不同 GUI 客户端可以轻松完成此过程,包括会话超时后自动重新身份验证。这包括将令牌页面解析为有效 cookie 的方法。该库的调用者可以实现其他功能,例如推断可选 cookie 数据(如域、路径、安全和主机端口),以解决 Rally 不返回完整 cookie 数据的情况(如测试环境)。

使用 C# ReST API 连接到 Rally 意味着构建 RallyRestApi 的实例。有两个旧版构造函数采用基本身份验证并采用用户名和密码以及其他参数。使用这些构造函数之一构造 RallyRestApi 将始终使用基本身份验证,并且永远不会使用 SSO。

第三个构造函数仅采用 IConnectionInfo 对象。这是获取 RallyRestApi 的首选方法。使用 IConnectionInfo 对象构造 RallyRestApi 允许调用者在一个对象中指定可用于 SSO 回调和多个 RallyRestApi 实例之间的身份验证共享的所有连接信息。

IConnectionInfo 和 ConnectionInfo

为了促进 SSO 身份验证,C# ReST API 引入了 IConnectionInfo 接口和 ConnectionInfo 类。这些类代表一个对象,该对象保存连接首选项,并且可以在请求时启动和完成基于浏览器的 SSO 身份验证会话。 ConnectionInfo 类实现所有连接首选项,并具有将 Rally SSO 登录页面解析为可用 Cookie 的方法。如果只需要基本身份验证,则可以按原样使用此类。 IConnectionInfo 的存在是为了灵活性,以防调用者不想扩展或以其他方式使用 ConnectionInfo。

使用 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);

当使用 IConnectionInfo 进行 SSO 时,调用者必须实现 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);

使用 IConnectionInfo 进行 SSO 时,缓存您发送的用于构造 RallyRestApi 的 IConnectionInfo 对象非常重要。成功 SSO 握手后,生成的 auth Cookie 将存储在 IConnectionInfo 对象中,并将用于从该 RallyRestApi 对象进行的所有后续 WSAPI 调用。如果您需要使用之前成功的 SSO 登录中的相同身份验证 Cookie 创建另一个 RallyRestApi 对象,只需使用相同的 IConnectionInfo 对象构造一个新的 RallyRestApi 对象,如果存在身份验证 Cookie,则会使用该对象。

Retries

授权 Cookie 可能会过期。 C# ReST Api 将检测过期的 SSO Cookie,并根据需要启动新的 SSO 登录会话以获得新的有效 Cookie。

这里的所有都是它的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Rally.RestApi.dll 进行单点登录? 的相关文章

  • 从看板中过滤史诗

    首先我想说我已经读过集会看板 隐藏史诗故事但我在根据估算板应用程序的过滤过程实现过滤器时仍然遇到麻烦 目前 我正在尝试将项目过滤器添加到我的纸板的查询对象中 查询对象调用 this getItems 以返回要从中进行筛选的项目数组 据我所知
  • Rally 使用 Web 服务 API 批量添加测试用例结果

    我们即将开始通过 API 更新 Rally 测试结果的阶段 我找不到通过 Web 服务 API 执行此操作的示例 例如发布 xml 谁能指出我这一点吗 我还想知道有什么能力可以批量执行此操作 例如一次性上传一组测试结果 也许有连接器可以将各
  • 具有自定义列渲染器排序的 Rally 网格

    背景 当我尝试按使用自定义渲染器的列进行排序时 没有任何反应 它将排序从 ASC 更改为 DESC 来回更改 但数据的顺序从未改变 我假设这是因为没有定义如何对我使用自定义渲染器操作的数据进行排序 但我似乎找不到向列添加排序器或排序函数的方
  • 相同的 WSAPI v2.0 安全密钥可在 REST 客户端中使用,但与 curl 一起使用时会产生无效密钥错误

    在浏览器的 REST 客户端中 当我发布到此 URL 时 https rally1 rallydev com slm webservice v2 0 HierarchicalRequirement create key 123abc 使用此
  • 如何使用 Rally REST .NET 获取工作区列表

    我正在尝试获取给定 Rally 订阅的可用工作区列表 但查询中似乎并未返回实际工作区 这是我到目前为止所拥有的 RallyRestApi restApi new RallyRestApi username password List
  • 如何使用 Rally REST .NET 将附件添加到用户故事

    我们正在将 NET Rally 代码从 SOAP 移植到 REST NET API 到目前为止 REST API 似乎更快并且更易于使用 因为每次工作产品自定义字段在 Rally 工作区中发生更改时都不会破坏 WSDL 不过 当我们尝试复制
  • 使用 App SDK 2.0 中的新数据更新图表

    我正在使用图表来可视化数据TimeboxScopedApp 我想在范围发生变化时更新数据 使用更暴力的方法remove 然后按照描述重新绘制图表here给我留下了一个覆盖的 正在加载 蒙版 但其他方面都有效 使用 Highchart 原生的
  • 如何在网格上添加自定义按钮并传递行值?

    我想向网格添加一个按钮 以便用户可以通过传入按钮行中的值来查看给定任务的时间表条目值 网格加载得很好 直到我将按钮添加到 columnCfgs 当按钮在那里时 我收到 Uncaught TypeError Object object Obj
  • 在 Rally 中查询用户故事修订

    我想使用与用户故事关联的 URL 检索修订日志的 JSON 对象 我使用以下代码通过 jQuery 完成了此操作 但我更愿意使用 Rally SDK 中的内置工具来完成此操作 我对 Ext Ajax 或 Ext data JsonP 请求没
  • SDK2:Rally Grids 中的链接和列宽

    我以简单的方式显示 Rally Grid 中缺陷的链接 columnCfgs FormattedID Name 这会创建到缺陷的链接 就像它应该的那样 但列宽太大了 但如果我执行以下操作 我就会丢失链接 columnCfgs dataInd
  • 集会看板 - 隐藏史诗故事

    有没有办法从 Rally 的看板应用程序中隐藏史诗故事 即与儿童有关的故事 大概通过将看板 目录应用程序 代码自定义为自定义应用程序 我发现看板 javascript 应用程序代码的一部分根据 分配给版本 的故事是否隐藏来设置查询 并且我在
  • 基于模型的拉力网格颜色行

    我有一个 Rallygrid 配置为显示两个模型 PortfolioItem Feature 和 PortfolioItem Rollup 我想在网格中为它们着色以区分它们 我不保证它们会在网格中交替 或者类似的东西 我只是想对卷应用一种微
  • 你可以使用集会 API 发送电子邮件通知吗?

    我正在构建一个自定义拉力应用程序 我需要从中发送电子邮件通知 有没有办法使用 Rally API 发送电子邮件 所以我不必使用像 Mandrill 或 Mailjet 这样的第三方服务 谢谢 无法通过 Rally API 来执行此操作
  • 拉力赛中的速度图[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在开展一个项目 从拉力赛中提取数据并创建速度图表 我了解要使用的 REST Web 服务 API 是缺陷 迭代 分层需求和迭代累积
  • Rally:按发布的计划状态拉动故事计数?

    我正在尝试从 API 中获取最新版本的故事计数 并按计划状态进行细分 目前有一份报告可以做到这一点 但我在 API 中没有看到任何公开的方法 有谁知道是否可以获得吗 您应该能够对每个计划状态进行查询 并从响应正文中获取 TotalResul
  • App SDK:查询工作区/多个项目的数据

    我正在创建一个报告 需要从包含多个项目的工作区获取数据 有没有办法在创建 RallyDataSource 时指定搜索整个工作区或多个项目 为每个项目创建一个数据源听起来并不是最好的方法 如果您的项目有一个共同的父项目 您可以将父项目和 pr
  • 通过 REST API Java 从 URL 获取 ObjectID

    我尝试将讨论添加到用户故事中 部分代码 QueryResponse storyQueryResponse restApi query storyRequest JsonObject storyJsonObject storyQueryRes
  • 如何通过 REST API 获取 Rally 实例中所有项目的列表?

    如何查询 Rally 实例中所有可用项目 REST 调用的输出 Workspaces rallyAPIMajor 1 rallyAPIMinor 29 ref https rally1 rallydev com slm webservice
  • Rally toolKit for Java 我如何创建 TestCaseResult 并将其附加到 TestCase

    一般代码在哪里testCase is a JsonObject JsonObject result new JsonObject result addProperty Verdict True result addProperty Test
  • 创建 Rally 测试文件夹时出现 .Net Rally.RestApi 错误“未授权执行操作:无效密钥”

    我有一个 C 应用程序 使用 NET 的 Rally Rest API 2 0 1 0 版 应用程序将成功查询 Rally 数据 但当我尝试创建对象时 返回错误 指示密钥无效 此问题从今天开始 并且该应用程序的多个用户都会出现此问题 我使用

随机推荐