gpt4 book ai didi

c# - 如何从 OKTA 获得用于单元/集成测试的 SAML 响应

转载 作者:太空狗 更新时间:2023-10-30 00:49:00 25 4
gpt4 key购买 nike

我正在从事他们通过 OKTA 的 SAML 进行身份验证的项目。我已经成功地将 SAMLResponse(通过 POST 方法)发送到网站的集成工作。

我以真正的 TDD 方式开始编写一些单元测试。我的单元测试采用 SAMLResponse(Base64 编码)。然而,我所有的单元测试都有效,因为 SAMLResponse 只有几分钟的生命周期(过期),我的单元测试在几分钟后中断。

所以我需要定期登录 OKTA,然后使用 Chrome 开发工具捕获发送到我的开发站点的流量。然后,我将 SAMLResponse 复制并粘贴到我的单元测试中,然后返回通过单元测试。显然,这不是理想的情况。

所以我的问题是如何以自动方式(最好是在 C# 中)登录 Okta 以获得 SAMLResponse?我假设有一些我可以使用用户名和密码发布到的 URL 并取回 SAMLReponse。我所有的 Fiddler 尝试理解所需的通信都让我感到沮丧。我正在寻找您可能拥有的任何指导。提前致谢。

最佳答案

我想出了一个可行的解决方案,并想与社区分享。 我不确定根据其他作者 (Joël Franusic) 的有用反馈回答我自己的问题的协议(protocol)。如果我违反协议(protocol),请告诉我。

感谢 Joël Franusic 的指点。我实现了他的 1.2 解决方案(带有 Okta 客户端的用户代理)在他的引用资料和 Okta 网站上的其他一些文档之间,我最终能够拼凑出工作代码。

private static async Task<string> GetTestSamlResponse()
{
try
{
// settings specific to my Okta instance
string username = "USERNAME GOES HERE";
string password = "PASSWORD GOES HERE";
var apiToken = "API TOKEN GOES HERE";

// this is the unique domain issued to your account.
// If you setup a dev account you'll have a domain in the form https://dev-<AccountNumber>.oktapreview.com.
// account number is a unique number issues by Okta when you sign up for the account
var baseUrl = "YOUR BASE URL GOES HERE";

// In Okta Admin UI, click "Applications" in main menu, choose your app, click "Sign On" tab. Under Sign On Methods, then under SAML 2.0, click "View Setup Instructions"
// Get the url called "Identity Provider Single Sign-On URL", paste it in th below line
var ssoUrl = "YOUR SSO URL GOES HERE";

// construct an Okta settings object
var settings = new Okta.Core.OktaSettings
{
ApiToken = apiToken,
BaseUri = new Uri(baseUrl)
};

// get session token from Okta
var authClient = new Okta.Core.Clients.AuthClient(settings);
var authResponse = authClient.Authenticate(username, password);
var sessionToken = authResponse.SessionToken;

// start session and get a cookie token
var sessionsClient = new Okta.Core.Clients.SessionsClient(settings);
var session = sessionsClient.CreateSession(sessionToken);
var cookieToken = session.CookieToken;

// using the cookie token, get the SAMLResponse from Okta via a HTTP GET.
var httpClient = new System.Net.Http.HttpClient();

// add User-Agent header, because apparently Okta is expecting this information.
// If you don't pass something, the Okta site will return a 500 - Internal Server error
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "UnitTest");

// add the cookie token to the URL query string
string url = string.Format("{0}?onetimetoken={1}", ssoUrl, cookieToken);

// do the HTTP GET
using (var response = await httpClient.GetAsync(url))
{
if (response.StatusCode == HttpStatusCode.OK)
{
// read the HTML returned
string html = await response.Content.ReadAsStringAsync();

// parse the HTML to get the SAMLResponse (using HtmlAgilityPack from NuGet)
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.LoadHtml(html);
// from the input field called SAMLResponse, get the "value" attribute
string samlResponse = htmlDoc.DocumentNode.SelectSingleNode("//input[@name='SAMLResponse']").Attributes["value"].Value;
return samlResponse;
}
else
throw new Exception(string.Format("Error getting SAML Response {0}", response.StatusCode));
}
}
catch (Exception ex)
{
throw;
}
}

关于c# - 如何从 OKTA 获得用于单元/集成测试的 SAML 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41639609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com