身份验证哪家强?Identity Server 初体验

哈德韦

共 4412字,需浏览 9分钟

 ·

2022-03-19 15:35

前几天发了一篇文章,对比了 Keycloak 和  Authing,结论是尽管 Keycloak 功能很强大,并且是开源产品,但是其中文文档的缺失,以及 Authing 和中国市场的深度结合,所以使用 Authing 不仅上手快,而且在和微信打通的场景下具有特别大的优势。

Free Arch: Keycloak vs Authing


我自己做了一个小小的演示,在微信小程序里集成 Authing 登录,主要工作在于配置,基本上是低代码开发模式。


但是,和 Keycloak 不同的是,Authing 是一个商业化产品,因此在很多方面做得比 Keycloak 要更好(起码 UI 看起来更现代,更舒服)。

当然借助开源社区, Keycloak 也可以和微信生态打通,如果还有没打通的地方,也许是开源爱好者的机会。我自己也借助开源社区的现有 Keycloak 插件,实现过基于 Keycloak 的关注微信公众号即登录的方案:

基于 keycloak 的关注公众号即登录功能的设计与实现

今天再以集成企业微信登录为例,对比一下几款不同的身份认证产品。

Authing

Authing 就略过了,因为它内置支持,并且官方有详细的接入文档。

Keycloak

Keycloak 官方完全没有企业微信的文档资料,好在有人贡献了 Keycloak 的企业微信登录开源插件,我也集成在自己的 Keycloak 实例中了,尽管这个插件做得比较粗糙,但是只需要填入几个参数,不用写一行代码。

效果如下视频所示:


集成步骤

首先,通过 https://github.com/kkzxak47/keycloak-services-social-wechatwork 获取企业微信登录插件。需要拷贝一个 jar 包,以及两个 html 模板文件,比如放在待集成的 Keycloak 项目的 idps 目录下:

3ef062c834e8e1beef015502353ae73b.webp


然后,在 Dockerfile 文件中,增加如下几行:

COPY idps/wecom/keycloak-services-social-wechat-work.jar \    /opt/jboss/keycloak/providers/
COPY idps/wecom/templates/realm-identity-provider-wechat-work.html \ /opt/jboss/keycloak/themes/base/admin/resources/partialsCOPY idps/wecom/templates/realm-identity-provider-wechat-work-ext.html \ /opt/jboss/keycloak/themes/base/admin/resources/partials
# add `<module name="org.infinispan" services="import"/>` to dependenciesRUN sed -ie 's#<dependencies>#<dependencies><module name="org.infinispan" services="import"/>#' /opt/jboss/keycloak/modules/system/layers/keycloak/org/keycloak/keycloak-services/main/module.xml

随后使用这个 Dockerfile 部署好后,你的 Keycloak 实例的身份提供者列表里就多了一个企业微信的选项。添加它后,填入相关的 ClientId、AgentId 以及 Secret,就集成完毕了。

完整的 Dockerfile 请见:https://github.com/Jeff-Tian/keycloak-heroku/blob/master/Dockerfile  。

IdentityServer

Authing 和 Keycloak 在之前都有多个系列文章介绍过,故本篇文章没有做详细介绍。但是 IdentityServer,有必要隆重介绍一下,因为这是我第一次了解到它:

IdentityServer 是一个授权服务器,它实现了 OpenID Connect (OIDC)以及 OAuth2.0 标准。Keyclock 是用 Java 写的,而 IdentityServer 是使用 C# 写的,并且是一个 ASP.NET Core 中间件,即不像 Keycloak,它本身不能独立存在,必须寄宿在一个 ASP.NET 或者 ASP.NET Core 的宿主应用中。它被设计用来提供一种通用的方式来为流向所有的应用的请求鉴权,不管是网页、原生应用、手机抑或 API 端点。即能为多个应用及应用类型实现单点登录,也能使用登录表单或者其他类似的用户界面来验证真实的用户,当然也能通过令牌颁发、验证、无界面地更新令牌等方式来为服务鉴权。

IdentityServer  的定位是高安全的 OAuth,尽管 OAuth 和 OIDC 已经成为了保护 API 的标准并得到了广泛的应用,但是有些环境是需要更高的安全性的。IdentityServer 可以支持这些需要 “OAuth 3.0” 的场景。

部署 IdentityServer

本文没有冠以 Free Arch 的标题,因为 IdentityServer 并不是免费的,即要真实投产,还得购买许可证。但是要测试完全没有阻碍。我要调研一下使用它来集成企业微信登录,首先得部署一个包含了 IdentityServer 中间件的应用,正如前面介绍的,IdentityServer 是一个中间件,还只能寄宿在 ASP.NET (Core) 的应用中,因此,需要找一个支持 ASP.NET Core 运行时的环境。

尽管 IdentityServer 本身不免费,但是好在仍然有可以免费托管它的云平台,因为是 ASP.NET Core 应用,自然想到了 Microsoft Azure。令人惊讶的是,Azure 提供了 10 个 App 的永久免费方案,实在太棒了!

IdentityServer 提供了一个包含 IdentityServer 中间件的示例应用,只要将它部署到 Azure 即可。直接 Fork 它到自己的 GitHub 账号下,比如:https://github.com/jeff-tian/IdentityServer。这样在后续的 Azure 平台操作时,可以方便地通过配置搞定 GitHub Actions CICD 流水线,毕竟 GitHub 现在是微软亲生的了。

在 Azure 控制台里创建一个 Web 应用,选择从 GitHub 部署,根据指引,授权 GitHub 后,选择刚刚 Fork 过来的仓库,直到走到“查看+创建”这一步,点击创建,就大功告成了!

a43bb99a43fb0f9e278bf39fce9f8fd3.webp


由于我是用了最新的 IdentityServer 6,于是给这个应用起名为 id6,Azure 给我的应用分配的域名就是:id6.azurewebsites.net/

在部署完成后,就可以访问这个链接了,但是当然不会自动有企业微信的登录方式。

创建一个企业微信应用

尽管在 Keycloak 集成企业微信登录时,我已经创建了一个企业微信应用,但是在这里不能复用。主要是由于企业微信应用里的扫码登录回调域名,只能设置一个,之前的设置了 Keycloak 实例的 URL,因此在这里,得为 id6.azurewebsite.net 再创建一个应用。

c67e544f0fa4fb53e51d4fb9ab674542.webp


并且设置好回调域名:

6355840d2545299e1c4f8b0bd8055748.webp

引入企业微信登录方式的依赖


感谢开源的世界,有人已经做好了企业微信和 IdentityServer 的适配,只需要引入到项目中即可。

<PackageReference Include="AspNet.Security.OAuth.WorkWeixin" Version="6.0.4" />

可以使用命令行一键完成依赖引入:


dotnet add package AspNet.Security.OAuth.WorkWeixin --version 6.0.4

增加企业微信登录的代码


需要找到文件 hosts/main/HostingExtensions.cs,并在添加外部身份提供者的代码处增加企业微信方式:

   private static void AddExternalIdentityProviders(this WebApplicationBuilder builder)    {        // configures the OpenIdConnect handlers to persist the state parameter into the server-side IDistributedCache.        builder.Services.AddOidcStateDataFormatterCache("aad", "demoidsrv");        builder.Services.AddAuthentication()            ...            .AddWorkWeixin("wecom", "企业微信", options => {                options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;                options.ClientId = "替换成你自己的";                options.ClientSecret = "替换成你自己的";                options.AgentId = "替换成你自己的";            });    }

提交到 GitHub 后,在 Azure 创建时自动生成的 GitHub Action 就开始工作了,重新部署后,这个示例应用就有了企业微信登录的方式:

https://id6.azurewebsites.net/Account/Login

4127c5bc4fda3f580694c9b5c116706a.webp


视频演示

总结

对小白来说,建议使用 Authing,中文文档以及和微信生态的结合都内置特别全面和详细的文档。善于折腾,则可以考虑 Keycloak,但是 Keycloak 部署起来的,消耗的资源其实比较大,选择 IdentityServer 则可以更轻量地部署。

尽管 Keycloak 使用 Java 开发,而 IdentityServer 使用 C#,但并不意味着,Keycloak 只能用在 Java 项目,也不意味着 IdentityServer 只能用在 ASP.NET 项目。尽管 IdentityServer 是一个中间件的存在,一定需要部署一个 ASP.NET (Core) 应用,但是一旦部署好,就和 Keycloak 一样,支持更上层的 OAuth 以及 OIDC 等等开放协议,它们并不依赖任何技术栈,所以都可以使用在任何语言开发的应用上。


浏览 125
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报