/ / Как да получите SAML Отговор от ОКТА за тестване на единица / интеграция - c #, тестване на единици, интеграция-тестване, saml, окта

Как да получите SAML Отговор от ОКТА за единица / интеграция тестване - c #, единица тестване, интеграция-тестване, saml, okta

Работя по проект, където те се удостоверяват чрез SAML от OKTA. Успешно получих работа по интеграция, където SAMLResponse изпрати (чрез POST метод) на уебсайта.

В истинската TDD мода започнах да пиша някоиединични тестове. Моите тестове за единица участват в SAMLResponse (който е кодиран в Base64). Всичките ми тестове на устройства обаче работят, тъй като SAMLResponse има само един живот (изтича) от няколко минути, а моите тестове се разбиват след няколко минути.

Така че трябва периодично да влизам в OKTA, след товас помощта на инструментите на Chrome за улавяне трафикът, който се изпраща до моя сайт за разработчици. След това копирам и поставям SAMLResponse в моите тестови единици и се връщам към преминаващите тестове на единици. Очевидно това не е желана ситуация.

Така че моят въпрос е как мога да вляза в Okta вавтоматизиран начин (за предпочитане в C #), за да получите SAMLResponse? Предполагам, че има някакъв URL, който мога да изпратя с потребителско име и парола и да получа обратно SAMLReponse. Всичките ми опити да разберат необходимите комуникации ме оставиха разочаровани. Търся насоки, които може да имате. Благодаря предварително.

Отговори:

4 за отговор № 1

Измислих работно решение и исках да го споделя с общността. Не съм сигурен в протокола за отговора на собствения си въпрос въз основа на полезна обратна връзка от други автори (Йоел Франъсич). Ако нарушавам протокола, моля да ме уведомите.

Благодаря на Йоел Франъзич за указателите. Въведох неговото решение 1.2 (User Agent with Okta client) Между неговите референции и няколко други документации на уебсайта на 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;
}
}

2 за отговор № 2

Има няколко начина за извършване на тестването, което предлагате, ето какво веднага идва на ум:

  1. Напишете прост HTTP "User Agent" в C # като използвате библиотека RestSharp или подобни.
  2. Изграждане на интеграционен тест срещу външен макет на IDP.
  3. Променете SAMLResponse и подпишете отново с вашия собствен ключ.

По-долу подробно разглеждам всеки подход.

Писане на обикновен HTTP "потребителски агент"

Предлагам този метод. Предлагам ви един от следните два подхода:

  1. Напишете общ потребителски агент, който ще открие и попълни полетата за потребителско име и парола. Написах инструмент в Python наречен "SAML-пратеник"Този подход изисква основния код във файла с име messenger.py.
  2. Използвайте API на Okta, за да изтеглите маркера на сесията и да го използвате, за да получите a SAMLResponse, Най- ОКТА-AWS-CLI-предположи-роля този подход. Кодът за извлича маркера на сесията и обмен на този сесиен маркер за SAMLResponse и двете са намерени в src/main/java/com/okta/tools/awscli.java файл.

Първият подход е по-общ и трябва да работи с всяко IdP с поле за потребителско име и парола. Вторият подход е вероятно това, което търсите, но е специфично за Окта.

И в двата случая, предлагам да се направи специален потребител в Okta, който е заключен и използван само за тестване.

Изграждане на интеграционен тест срещу макет на IDP

Този подход ще ви накара да създадете макет на ИДП, който ще ви даде SAMLResponse без удостоверяване, аз използвах SAML,-IDP проект за това преди.

Обратната страна на този подход е, че тя Трябва изискват по-малко C #, за да пишете, за сметка на поемането на друга зависимост.

Промяна на повторно подписване a SAMLResponse

Аз наистина включвам само тази опция тукза пълнота и като начин да ви предупредя да не опитате този подход. Научаването на SAML ще ви постави лице в лице с безумие и съжаление. Не предлагам този подход.