аутентифицироваться в SharePoint через OKTA из серверной службы

Мне необходимо программно подключиться к клиентскому серверу SharePoint, который использует OKTA для аутентификации. Я видел этот пост, который выглядел многообещающим, но не мог получить обратно действительный файл cookie сеанса от OKTA.

Я могу успешно вызвать конечную точку / api / v1 / authn и получить обратно токен сеанса, но когда я оборачиваюсь и вызываю / api / v1 / sessions? AdditionalFields = cookieToken с этим токеном сеанса, я всегда получал 403 - Запрещено, с следующий json:

{ 
"errorCode": "E0000005", 
"errorSummary": "Invalid Session", 
"errorLink": "E0000005", 
"errorId": "oaew0udr2ElRfCnZvBFt075SA", 
"errorCauses": [] 
}

Предполагая, что я могу решить эту проблему, я не уверен, какой URL-адрес следует вызвать с помощью cookieToken. Является ли URL-адрес конечной точкой OKTA, которая будет перенаправлять на SharePoint, или это конечная точка SharePoint, которая установит сеанс с файлом cookie?

Обновление: я могу вызвать эту конечную точку okta -> / api / v1 / sessions? additionalFields = cookieToken с моими учетными данными пользователя как json

{ 
"username": "[email protected]",
"password": "P@ssw0rd"
}

И я могу получить одноразовый токен cookie, который можно использовать с этой ссылкой для запуска сеанса SAML в браузере:

https://[mydomain].okta.com/login/sessionCookieRedirect?redirectUrl=[sharepoint site url]&token=[cookie token]

Это работает в браузере, пользователь автоматически аутентифицируется и попадает в SharePoint. Однако кажется, что эта «настройка» сеанса, по крайней мере, частично достигается с помощью javascript, поскольку выполнение той же ссылки в программном HTTP-клиенте (таком как HTTP-клиент Apache) не работает. HTTP-клиент отправляется через несколько перенаправлений и попадает на сайт SharePoint, но пользователь не проходит проверку подлинности. Ответ 403 - Запрещено со следующими заголовками:

403 - ЗАПРЕЩЕНО

Content-Type -> text/plain; charset=utf-8
Server -> Microsoft-IIS/8.5
X-SharePointHealthScore -> 0
SPRequestGuid -> 0ecd7b9d-c346-9081-cac4-43e41f3b159a
request-id -> 0ecd7b9d-c346-9081-cac4-43e41f3b159a
X-Forms_Based_Auth_Required -> https://[sharepoint site]/_login/autosignin.aspx?ReturnUrl=/_layouts/15/error.aspx
X-Forms_Based_Auth_Return_Url -> https://[sharepoint site]/_layouts/15/error.aspx
X-MSDAVEXT_Error -> 917656; Access denied. Before opening files in this location, you must first browse to the web site and select the option to login automatically.
X-Powered-By -> ASP.NET
MicrosoftSharePointTeamServices -> 15.0.0.4709
X-Content-Type-Options -> nosniff
X-MS-InvokeApp -> 1; RequireReadOnly
Date -> Fri, 13 May 2016 15:02:38 GMT
Content-Length -> 13

Я начинаю сомневаться в том, что это безнадежное дело, ведь OKTA или SharePoint не поддерживают программную аутентификацию через SAML.


person Mike    schedule 10.05.2016    source источник


Ответы (1)


Возможно.

Вот что я сделал. 1) Получите свой sessionToken от Okta. Для этого вам понадобится токен авторизации okta.

2) Сделайте HttpGet (sharepointEmbeddedLink + "? Onetimetoken =" + sessionToken) Также добавьте этот заголовок: новый BasicHeader (АВТОРИЗАЦИЯ, String.format ("SSWS% s", OKTA_AUTHORIZATION_TOKEN);

3) Затем вам нужно будет проанализировать ответ html и получить аргументы SAML: WRESULT, WCTX, WA.

4) Затем сделайте это - возьмите эти 3 и создайте строку в этом формате «application / x-www-form-urlencoded». Это будет примерно так: «wa = wsign1.0 & wctx = somevalue & wresult = somevalue».

        byte[] out = theStringAbove.getBytes;
        int length = out.length;

        URL url = new URL("https://login.microsoftonline.com/login.srf");
        URLConnection con = url.openConnection();
        HttpURLConnection http = (HttpURLConnection) con;

        http.setRequestMethod("POST"); // PUT is another valid option
        http.setDoOutput(true);
        http.setInstanceFollowRedirects(true);
        http.setFixedLengthStreamingMode(length);
        http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
        http.setRequestProperty("User-agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1");
        http.connect();
        http.getOutputStream().write(out);

5) В ответе будет указан токен saml. Вам придется снова проанализировать html-файл.

6) На шаге 3 или 4 вы получите sharepoint siteUrl и сделаете следующее :)

    HttpPost httpPost = new HttpPost(siteUrl + "_forms/default.aspx?wa=wsignin1.0");
    byte[] utf8TokenStringBytes = ("t=" + samlToken).getBytes(StandardCharsets.UTF_8);
    HttpEntity entity = new ByteArrayEntity(utf8TokenStringBytes);
    httpPost.setEntity(entity);
    httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
    httpPost.setHeader("User-agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1");

    HttpResponse response = httpclient.execute(httpPost, httpContext);

Если все в порядке, у вас будет несколько заголовков файлов cookie, которые вы можете использовать: D

person Hritcu Andrei    schedule 03.02.2017