客户端调用Portal的SAML身份验证

3
分享 2018-03-06
安全声明标记语言 (SAML) 是一种在身份提供者与服务提供者(此处为 Portal for ArcGIS)之间交换身份验证和授权数据时提供安全保护的开放标准。完成此操作的方法被称为 SAML Web 单点登录。该门户与 SAML 2.0 兼容,并且能够与支持 SAML 2 Web 单点登录的身份提供者相集成。设置 SAML 的优势是您不需要为访问 Portal for ArcGIS 的用户创建其他登录帐户;他们可以使用在企业标识储存中已设置的登录帐户。
本文使用的SAML平台是自己部署的OpenSAML,参考github。https://github.com/sunrongxin7 ... mo-v3
这里为Portal配置了OpenSAML。本文不涉及此配置过程,过程可以参考:https://enterprise.arcgis.com/ ... l.htm
配置完毕后,登录时是这样的
配置好saml.png

点击使用OpenSAML账号登录,会跳转到OpenSAML身份验证页面。
点击使用ArcGIS账户登录,和之前没区别。
本文主要实现了在客户端网页程序直接跳转到Portal联合OpenSAML身份验证页面。
实现方法非常简单,使用iframe获取指定portal的登录界面。使用document.getElementById('idp_Name').click()获取到第一个选项的dom对象并点击即可。
代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="">
<link rel="icon" href="css/favicon.ico">
<title>登录页面-SAML登录</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/cover/cover.css" rel="stylesheet">
</head>
<body>
<!--用于登录 start display: none;-->
<iframe dojoattachpoint="_iFrame" id="oAuthFrame" name="oAuthFrame1" scrolling="no" style="display: none; border: 0px;" marginheight="0" marginwidth="0" frameborder="0" width="400" height="400" src="">
Your browser does not support iframes.
</iframe>
<!--用于登录 end-->

<div class="site-wrapper">
<div class="site-wrapper-inner">
<div class="cover-container">
<div class="inner cover">
<h1 id="helloId" class="cover-heading">登录Portal,直达SAML页面</h1>
<br>
<div class="input-group input-group-lg">
<span class="input-group-addon" id="sizing-addon1">@</span>
<input type="text" class="form-control" id="id_portalUrl"
aria-describedby="sizing-addon1" value="https://120win105.esrichina.com/portal">
</div>
<br>
<br>
<p class="lead">
<a id="SAMLLogin" onclick="myclick()" href="javascript:;" class="btn btn-lg btn-default">SAML登录(请先输入portalURL)</a>
</p>
</div>
</div>
</div>
</div>
<script type="text/javascript">
function myclick(){
var portalUrl = document.getElementById("id_portalUrl").value;
var params1 = portalUrl.split("//");
var params2 = params1[1].split("/");
var portalDomain = params2[0];
var portalInstance = params2[1];
var iframe = document.getElementById("oAuthFrame");
iframe.src = 'https://' + portalDomain + '/' + portalInstance +
'/sharing/rest/oauth2/authorize?client_id=arcgisonline&redirect_uri=https://' +
portalDomain + '/' + portalInstance +
'/home/postsignin.html&response_type=token&display=iframe&parent=https://' +
portalDomain + '&expiration=20160&locale=zh-cn';
iframe.onload = function(){//IE onreadystatechange方法判断iframe.readyState == "complete"
setTimeout(function(){
console.log(window.frames["oAuthFrame1"].document.getElementById('idp_Name'));
window.frames["oAuthFrame1"].document.getElementById('idp_Name').click();
},5000)
};

}
</script>

</body>
</html>
实现效果如下:
SAML.gif

 
遗留问题,如果和portal不在一台机上部署,在获取iframe的dom对象时会遇到跨域问题。还未解决。

0 个评论

要回复文章请先登录注册