在为我的公司开发一个内部部署的、仅限内部网的REST API服务器时,我在身份验证问题上完全把自己搞糊涂了。
:
- 一个使用c#实现的REST web服务器,使用自托管Nancy,作为Windows服务运行
- 一个可以查询服务器的c#客户端,由我们公司的用户运行
I do not have:
- 任何形式的访问我们的活动目录和/或域控制器,除了在Windows下运行的任何应用程序通常有
- 任何影响AD设置或配置的方法
- Active Directory Federation Services (ADFS)(我认为。我们使用Windows 7和Office 2010,只是为了给一些关于软件景观状态的看法)
- Azure Active Directory (AAD)
希望:
- 服务器验证请求是由我们公司的用户发出的一种方法
- 如果客户端必须在每个请求中发送一些额外的身份验证数据,只要不以任何形式包含用户的密码 就完全可以。
I do not want to:
- 必须设置任何额外的软件(我的服务器必须最小配置和维护,所以一般用户可以安装和运行它)
- 安装/配置/维护IIS服务器(见上文)
- 使用ASP.net(对于我的需求来说太大了,再加上上面的要点)
- 以任何方式处理用户密码(公司政策和常识)
- 模拟用户(我只需要验证请求的真实性)
- 实现自己的用户帐户数据库。我们已经有六个服务需要自己的用户名/密码组合,我不想再添加一个
我读过一些文章,这些文章展示了如何在IIS中使用Windows身份验证,或者如何在Nancy中使用Azure Active Directory (AAD)。这里的其他问题已经告诉我如何针对Active Directory验证用户名/密码组合。然而,这些都不能满足我的所有要求,或者有自己的要求(如AAD/ADFS),我不能满足。
看起来Kerberos/SSPI可能是我想要的,但是使用c#似乎非常复杂。有可能我将不得不走这条路,但我真的可以从一些最小的工作示例中受益(公认的答案提供了一个c#实现/包装器,包括一个示例项目,但我似乎无法使它的头或尾)。
也许我很天真,但我想象的解决方案是沿着以下几行:
- 客户端使用当前登录用户 的凭据查询服务(AD,域控制器,…?)以获取某种形式的身份验证令牌
- 令牌然后与用户名一起发送到服务器,作为需要进行身份验证的请求的一部分
- 服务器提取令牌,并向同一服务(AD,域控制器,…)查询令牌是否真实,有效并且属于相关用户
这可能吗?理想情况下,有一些现成的库,我可以插入到我的项目(我知道,我正在达到)?
您可以使用无状态身份验证和Jwt来完成此操作。将用户名和密码发送到"/auth"(示例),"/auth"将搜索AD(示例)并验证用户是否存在,然后使用加载时的用户名创建Jwt令牌。当您发出请求时,您将只发送Jwt令牌,Nancy将验证令牌。