身份验证哪家强?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 的关注微信公众号即登录的方案:
今天再以集成企业微信登录为例,对比一下几款不同的身份认证产品。
AuthingAuthing 就略过了,因为它内置支持,并且官方有详细的接入文档。
KeycloakKeycloak 官方完全没有企业微信的文档资料,好在有人贡献了 Keycloak 的企业微信登录开源插件,我也集成在自己的 Keycloak 实例中了,尽管这个插件做得比较粗糙,但是只需要填入几个参数,不用写一行代码。
效果如下视频所示:
集成步骤
首先,通过 https://github.com/kkzxak47/keycloak-services-social-wechatwork 获取企业微信登录插件。需要拷贝一个 jar 包,以及两个 html 模板文件,比如放在待集成的 Keycloak 项目的 idps 目录下:
然后,在 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/partials
COPY 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 dependencies
RUN 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 。
IdentityServerAuthing 和 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 过来的仓库,直到走到“查看+创建”这一步,点击创建,就大功告成了!
由于我是用了最新的 IdentityServer 6,于是给这个应用起名为 id6,Azure 给我的应用分配的域名就是:id6.azurewebsites.net/。
在部署完成后,就可以访问这个链接了,但是当然不会自动有企业微信的登录方式。
创建一个企业微信应用
尽管在 Keycloak 集成企业微信登录时,我已经创建了一个企业微信应用,但是在这里不能复用。主要是由于企业微信应用里的扫码登录回调域名,只能设置一个,之前的设置了 Keycloak 实例的 URL,因此在这里,得为 id6.azurewebsite.net 再创建一个应用。
并且设置好回调域名:
引入企业微信登录方式的依赖
感谢开源的世界,有人已经做好了企业微信和 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
视频演示
总结对小白来说,建议使用 Authing,中文文档以及和微信生态的结合都内置特别全面和详细的文档。善于折腾,则可以考虑 Keycloak,但是 Keycloak 部署起来的,消耗的资源其实比较大,选择 IdentityServer 则可以更轻量地部署。
尽管 Keycloak 使用 Java 开发,而 IdentityServer 使用 C#,但并不意味着,Keycloak 只能用在 Java 项目,也不意味着 IdentityServer 只能用在 ASP.NET 项目。尽管 IdentityServer 是一个中间件的存在,一定需要部署一个 ASP.NET (Core) 应用,但是一旦部署好,就和 Keycloak 一样,支持更上层的 OAuth 以及 OIDC 等等开放协议,它们并不依赖任何技术栈,所以都可以使用在任何语言开发的应用上。