到现在为止,我已经阅读拉力赛rest api不支持SSO的登录。我相信这不是真的Jan2014年。同API是使用集中的Excel(这里就是链接 集会加在Excel)支持SSO的登录。我可以获得源代码的拉力赛的Excel加或至少请人提供的一个例SSO使用集会rest api?

我想做同样的事情是什么Excel Addin出口的功能,但确实想要做的纯净。净的应用程序。

有帮助吗?

解决方案

我已经加入a howto C#其余Api,解释如何做到SSO的认证等集会并在Excel中插件。我粘贴在这里为了方便。

谢谢,斯科特

一个简短的集会SSO底漆

集会的网络服务API(WSAPI)支持只有基本的认证。使用基本的认证,WSAPI会议必须发起一个用户名和密码就是确认反对一个清单的用户名和密码存储直接在集会。这个工作很好,直到客户开始使用单一登录(SSO)。SSO使得客户可以使用一个单一的企业范围的认证机制(例如LDAP或活动目录)管理用户的凭证和密码。直到现在,使用WSAPI与SSO的启用具有所需的客户保持一个重复的用户名单(在"白名单")在集会的所有用户都希望使用集WSAPI.最近的变化反弹,现在允许WSAPI用户可以访问的集会使用他们的SSO的凭证和缓解需要保持这些用户在"白色"清单。

注:集会的当前SSO的执行情况是根据临时规范中要求用户的互动与一浏览器,以完成身份验证。因此,这种技术需要用户进行互动与一浏览器,因此它不符合无头WSAPI的客户喜欢那些同步反弹风险和错误的跟踪工具。

当发起一个SSO的连接,用户提供了一个网址,开始SSO的握手与集会的服务提供商(SP),以后涉及该客户的身份提供者(国内流离失所者),以及完成与反弹回应,表示有效的身份验证的会议。如果那证session cookie包括在任何随后的WSAPI话、集会将这些呼吁的经验证用户和WSAPI的呼吁将进行身份验证。以很容易地获得认证的session cookie的目的WSAPI电话下面的一个成功的CA SSO的认证,集会寻找一个参数增加到最初的SSO的URL,如果本会返回一个特殊的网页包含该届会议cookie明文作为最终产品的SSO的握手。用户可以使用这些数据对构建一个饼干可用于随后的WSAPI话。

注:例网址下面(潜在的)具体团结的内部SSO的执行。自SSO是用来让客户提供他们自己的认证使用他们自己的SSO的基础设施(至少将国内流离失所者的一部分),SSO的网址将客户特有的。联系你的集会TAM或集会的支持对于帮助SSO的网址。

一个原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

注:这name/value pair集SSO RelayState在拉力赛的具体SSO的实施使用PingIdentity为SSO的供应商。其他SSO的供应商可能有不同的参数使用的名称设置RelayState.例如,一些SSO的供应商使用RelayState作为参数的名字。在任何情况下,价值都是相同(即"https://us1.rallydev.com/slm/j_sso_security_check?noRedirect=true”)

因此,一个完整的网址看起来会像:

 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的网址,在验证之后,他们将出现一个网页,该网页包含以下内容:

<!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呼吁,这些呼吁将成功通过身份验证。请注意,任择cookie数据,如安全和路径,必须推断呼吁得到的饼干作为每IETF规范饼干。

所以基本过程的记录进入集会自一个图形用户界面(同样,这并不适用于无头的环境下)为目的发放WSAPI呼吁如下:

  • 收集SSO网址的用户与特别参数上所述。
  • 启动一个浏览指出,该网址。
  • 后导航完成,刮cookie值从返回HTML网页。
  • 近浏览器。
  • 构建一个cookie从cookie值。
  • 商店cookie供以后使用。
  • 发送饼干与所有后续WSAPI话。

重复这个过程如果一个WSAPI叫失败的认证使用这个饼干。记住,这些饼干到期,你应该准备尝试失败后重新认证,以创造一个光滑的用户经验。

反弹C#其余API

反弹C#其余API有一个机制纳入它是连接的框架,以使这一过程的容易的不同GUI客户包括自动重新认证下一届会议的超时。这包括的方法来分析的令牌页成为一个有效的cookie。呼叫本库可以实现的其他功能,例如可选择的推断cookie数据(如域、路径、安全和主口)考虑到的情况(如测试环境)在集会的不返回的完整cookie数据。

连接的集会使用的C#其余API装置构筑一个实例RallyRestApi.有两个传统构造,承担基本的身份验证和采取的用户名和密码,除其他参数。建设一个RallyRestApi使用这些构造将始终使用基本的认证,并将永远不会使用SSO。

第三个构造只需要一个IConnectionInfo对象。这是首选的方式获得RallyRestApi.使用IConnectionInfo目来构建一个RallyRestApi允许的呼叫者指定的所有连接的信息在一个对象,可用于SSO回调和认证之间分享多RallyRestApi实例。

IConnectionInfo和ConnectionInfo

促进SSO的认证,C#其余API介绍了IConnectionInfo口和ConnectionInfo类。这类表示的对象保持连接偏好和可以发起和完成一个基于浏览器的SSO的身份验证会议时要求这样做。该ConnectionInfo类实现所有的连接偏好和具有方法分析了集会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;
    }
} 

这个例子使用它的对话与浏览器组件本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,重要的是要缓存IConnectionInfo对象,你送来构建一个RallyRestApi.成功后SSO的握手,所得到的授权Cookie存在IConnectionInfo目,并将用于所有后续WSAPI呼吁从那RallyRestApi对象。如果你需要另外创建一个RallyRestApi物体使用相同的授权Cookie从先前成功的SSO的登录,只是建造一个新的RallyRestApi对象相同的IConnectionInfo目的和如果有一个验证Cookie本,这将可以使用。

重试

授权饼干可以过期。C#其余Api将检测到期的SSO的饼干,并将启动一个新的SSO登录届会议作为需要获得一个新的有效的Cookie。

这就是所有的。

其他提示

我们的工具包目前不支持SSO。我们使用一些特殊的黑客来为Excel插件工作,但没有任何用户友好的接口,足以与我们的开发人员社区分享。

我们正在处理一个OAuth解决方案,应该使项目更容易做到。一旦它船舶,我们应该发布一个博客来向您展示它的功能。我的个人希望是,我们所有的工具包都将支持使用OAuth简单。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top