用于 ADFS 移动身份验证的 Azure ACS 替代方案
Azure ACS alternative for ADFS mobile authentication
我一直在使用 azure ACS 通过公司 ADFS 向我的 asp.net 服务器应用程序验证我的移动客户端。我设法让它不仅在网络浏览器中运行良好,而且在移动应用程序上运行良好(使用 webview 获取 jwt 令牌,然后将其发送到服务器进行验证并生成应用程序授权令牌)。
但不幸的是Azure ACS is being discontinued所以我必须寻找替代方案。
使用 this article 我设法在没有任何外部服务的情况下直接进行 ADFS 身份验证,这对我来说是一个巨大的优势,因为一些客户可能在他们的内部网上有互联网限制。
当我尝试为本机客户端(Windows WPF、Android 和 iOS)实现此功能时,问题就开始了,因为我找不到针对这些情况的解决方案。
Android 和 iOS seems to require Windows Server 2012 R2 的 ADAL。这个限制是一个很大的禁忌。
我找到了第 3 方身份验证提供商 Auth0 但我真的想避免使用外部服务。
还有 Azure B2C 身份验证,但它有同样的外部服务问题。
有没有办法直接在 ADFS 上实现我在 Azure ACS 上的功能?我需要的是一种直接从 ADFS 获取 jwt 令牌(甚至 SAML2 令牌)的方法。
ACS 使用 WS-Fed,这是该示例使用的协议。
移动设备使用 OAuth,这就是您需要 ADFS 3.0(有限支持)或 ADFS 4.0(全面支持加上 OpenID Connect)的原因。
如果您只想让 ADFS return 一个 JWT 令牌而不是 SAML 令牌,请参阅此 article。
Set-ADFSRelyingPartyTrust –TargetIdentifier ‘urn:MyWebApp’ –EnableJWT
$true
但是,这需要 ADFS 3.0。
另一种方法是使用 WCF。这将调用 WS-Fed 活动配置文件,该配置文件 return 将 SAML 令牌作为 Web 服务按照此 article。
我根据自己的需要创建了自定义解决方案。基本上我实现了一个类似于 ACS 流程的解决方案。
应用程序在 Web 视图上加载一个特殊的登录页面,该页面将浏览器重定向到 ADFS 质询页面,并最终回调到我的 Web 应用程序。在那里,我通过使用通知 javascript 调用来通知带有令牌的应用程序,就像 ACS 所做的那样:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Loading...</title>
<script type="text/javascript">
try{
window.external.notify('@ViewBag.Result');
}
catch(err){
alert("Error ACS50021: window.external.notify is not registered.");
}
</script>
</head>
<body>
</body>
</html>
这样我的应用程序就不会直接处理用户凭据,我也不再需要外部服务:)
与 ACS 不同,我可以直接控制最后一步,我可以通过重定向导出令牌到自定义协议,该协议有助于在 iOS 上实现(在 ACS 上,我们必须注入 javascript到webview中的页面来实现这个)。
我一直在使用 azure ACS 通过公司 ADFS 向我的 asp.net 服务器应用程序验证我的移动客户端。我设法让它不仅在网络浏览器中运行良好,而且在移动应用程序上运行良好(使用 webview 获取 jwt 令牌,然后将其发送到服务器进行验证并生成应用程序授权令牌)。
但不幸的是Azure ACS is being discontinued所以我必须寻找替代方案。
使用 this article 我设法在没有任何外部服务的情况下直接进行 ADFS 身份验证,这对我来说是一个巨大的优势,因为一些客户可能在他们的内部网上有互联网限制。
当我尝试为本机客户端(Windows WPF、Android 和 iOS)实现此功能时,问题就开始了,因为我找不到针对这些情况的解决方案。
Android 和 iOS seems to require Windows Server 2012 R2 的 ADAL。这个限制是一个很大的禁忌。
我找到了第 3 方身份验证提供商 Auth0 但我真的想避免使用外部服务。
还有 Azure B2C 身份验证,但它有同样的外部服务问题。
有没有办法直接在 ADFS 上实现我在 Azure ACS 上的功能?我需要的是一种直接从 ADFS 获取 jwt 令牌(甚至 SAML2 令牌)的方法。
ACS 使用 WS-Fed,这是该示例使用的协议。
移动设备使用 OAuth,这就是您需要 ADFS 3.0(有限支持)或 ADFS 4.0(全面支持加上 OpenID Connect)的原因。
如果您只想让 ADFS return 一个 JWT 令牌而不是 SAML 令牌,请参阅此 article。
Set-ADFSRelyingPartyTrust –TargetIdentifier ‘urn:MyWebApp’ –EnableJWT $true
但是,这需要 ADFS 3.0。
另一种方法是使用 WCF。这将调用 WS-Fed 活动配置文件,该配置文件 return 将 SAML 令牌作为 Web 服务按照此 article。
我根据自己的需要创建了自定义解决方案。基本上我实现了一个类似于 ACS 流程的解决方案。
应用程序在 Web 视图上加载一个特殊的登录页面,该页面将浏览器重定向到 ADFS 质询页面,并最终回调到我的 Web 应用程序。在那里,我通过使用通知 javascript 调用来通知带有令牌的应用程序,就像 ACS 所做的那样:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Loading...</title>
<script type="text/javascript">
try{
window.external.notify('@ViewBag.Result');
}
catch(err){
alert("Error ACS50021: window.external.notify is not registered.");
}
</script>
</head>
<body>
</body>
</html>
这样我的应用程序就不会直接处理用户凭据,我也不再需要外部服务:)
与 ACS 不同,我可以直接控制最后一步,我可以通过重定向导出令牌到自定义协议,该协议有助于在 iOS 上实现(在 ACS 上,我们必须注入 javascript到webview中的页面来实现这个)。