3

我需要以编程方式连接到使用 OKTA 进行身份验证的客户的 SharePoint 服务器。我看到这篇文章看起来很有希望,但似乎无法从 OKTA 获得有效的会话 cookie。

我可以成功调用 /api/v1/authn 端点并取回 sessionToken,但是当我转身并使用该会话令牌调用 /api/v1/sessions?additionalFields=cookieToken 时,我总是收到 403 - Forbidden,其中以下json:

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

假设我可以解决这个问题,我不确定应该使用 cookieToken 调用的 URL。该 url 是一个将重定向到 SharePoint 的 OKTA 端点,还是一个将使用 cookie 设置会话的 SharePoint 端点?

更新: 我可以使用我的用户凭据作为 json 调用这个 okta 端点 -> /api/v1/sessions?additionalFields=cookieToken

{ 
"username": "user@email.com",
"password": "P@ssw0rd"
}

并且能够检索可与此链接一起使用的一次性 cookie 令牌,以在浏览器中启动 SAML 会话:

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

这适用于浏览器,用户会自动进行身份验证并最终进入 SharePoint。但是,似乎这个会话“设置”至少部分是通过 javascript 实现的,因为在编程 HTTP 客户端(例如 Apache HTTP 客户端)中执行相同的链接不起作用。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 进行编程身份验证。

4

1 回答 1

1

这是可能的。

这就是我所做的。1) 从 Okta 获取您的 sessionToken。为此,您需要一个 okta 授权令牌。

2) 做一个 HttpGet(sharepointEmbeddedLink + "?onetimetoken=" + sessionToken) 还添加这个头: new BasicHeader(AUTHORIZATION, 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

于 2017-02-03T14:28:49.247 回答