Azure ACS替代ADFS移动身份验证

时间:2017-05-29 10:36:47

标签: android ios asp.net jwt adfs2.0

我一直在使用azure ACS使用公司ADFS向我的asp.net服务器应用程序验证我的移动客户端。我设法不仅让它在Web浏览器中运行良好,而且还在移动应用程序上运行(使用webview获取一个jwt令牌,然后将其发送到服务器进行验证并生成应用程序身份验证令牌)。

但遗憾的是Azure ACS is being discontinued所以我必须寻找替代方案。

使用this article我设法直接使用ADFS auth而没有任何外部服务,这对我来说是一个巨大的优势,因为有些客户可能对其内部网有互联网限制。

当尝试为本机客户端(Windows WPF,Android和iOS)实现此问题时,问题就开始了,因为我无法找到这些案例的解决方案。

适用于Android和iOS的ADAL seems to require Windows Server 2012 R2。这个限制是一个很大的禁忌。

我找到了第三方身份验证提供程序Auth0,但我真的想避免使用外部服务。

还有Azure B2C身份验证,但它有相同的外部服务问题。

有没有办法直接在ADFS上实现Azure ACS的功能?我需要的是一种直接从ADFS获取jwt令牌(甚至是SAML2令牌)的方法。

2 个答案:

答案 0 :(得分:0)

ACS使用WS-Fed,该样本用作协议。

移动设备使用OAuth,这就是您需要ADFS 3.0(有限支持)或ADFS 4.0(完全支持以及OpenID Connect)的原因。

如果您只想让ADFS返回JWT令牌而不是SAML令牌,请参阅此article

  

Set-ADFSRelyingPartyTrust -TargetIdentifier'urn:MyWebApp'-EnableJWT   $真

但是,这需要ADFS 3.0。

另一种方法是使用WCF。这将调用WS-Fed活动配置文件,该配置文件根据此article将SAML令牌作为Web服务返回。

答案 1 :(得分:0)

我根据自己的需求创建了自定义解决方案。基本上我实现了类似于ACS流程的解决方案。

应用程序在webview上加载一个特殊的登录页面,将浏览器重定向到ADFS质询页面,最后回调到我的webapp。在那里,我通过使用通知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中的页面来实现这一点)。