【问题标题】:authenticate to SharePoint through OKTA from back-end service从后端服务通过 OKTA 向 SharePoint 进行身份验证
【发布时间】:2016-05-10 14:07:46
【问题描述】:

我需要以编程方式连接到使用 OKTA 进行身份验证的客户 SharePoint 服务器。我看到这个 post 看起来很有希望,但似乎无法从 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 进行的编程身份验证。

【问题讨论】:

    标签: sharepoint saml okta okta-api


    【解决方案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 步中获取共享点 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-03
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多