gpt4 book ai didi

sharepoint - 从后端服务通过 OKTA 向 SharePoint 进行身份验证

转载 作者:行者123 更新时间:2023-12-04 17:59:39 30 4
gpt4 key购买 nike

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

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

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

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

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

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

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

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

在浏览器中工作,用户会自动进行身份验证并最终进入 SharePoint。但是,似乎此 session “设置”至少部分是通过 javascript 实现的,因为在编程 HTTP 客户端(例如 Apache HTTP 客户端)中执行相同的链接不起作用。 http 客户端通过几个重定向发送并最终到达 SharePoint 站点,但用户未通过身份验证。响应为 403 - 禁止使用以下 header :

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 进行编程身份验证。

最佳答案

这是可能的。

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

2) 执行 HttpGet(sharepointEmbeddedLink + "?onetimetoken="+ sessionToken) 还要添加此 header :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 token 。您将不得不再次解析 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 header :D

关于sharepoint - 从后端服务通过 OKTA 向 SharePoint 进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37140940/

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