使用自定义用户数据库进行 Web API 令牌身份验证

Posted

技术标签:

【中文标题】使用自定义用户数据库进行 Web API 令牌身份验证【英文标题】:Web API token authentication with a custom user database 【发布时间】:2014-08-09 09:38:54 【问题描述】:

我正在开发一个 Web API 2.1 服务,该服务需要对连接的客户端(我将创建和控制的 html5/JS 客户端)进行身份验证。不幸的是,用户信息(用户名、密码哈希、角色和更多信息)存储在我只有读取权限的现有(SQL Server)数据库中。用户数据库表是在 5-6 年前创建的,没有参考任何安全框架,因此它是一种完全自定义的格式。我不允许对数据或数据库结构进行任何更改。

受this article 的启发,我推出了自己的基于令牌的用户身份验证方法,但我缺乏使用已建立的安全框架的完整性和(重新)保证。

有没有办法整合现有的框架,例如OAuth2,在我当前的项目中,考虑到我上面提到的限制?我不知道这是否有任何区别,但我使用 OWIN 进行自托管。

【问题讨论】:

我正在研究一个类似的问题 - 现有的 API 令牌在我需要使用的数据库中。目前我看到 2 个选项:1)一个 HTTP 模块或消息处理程序,它拦截令牌并整理出当前的主体(基本身份验证)。 2) 使用 ASP.NET 身份持有者令牌来查看我是否可以使用自定义令牌来解决这个问题.... 还不确定要使用哪个 :) 您可以将会话详细信息存储在单独的数据库/表中吗? 有效的问题,我希望有人有一个好的答案。集成到遗留系统是一种常见的情况,似乎经常被忽视。 【参考方案1】:

这是对类似问题的一个很好的回答。 它基本上说:

创建一个实现IUser的自定义用户类 定义实现public class UserStoreService : IUserStore<CustomUser>, IUserPasswordStore<CustomUser>的自定义用户存储 把所有东西都连接起来

由于答案非常广泛,我只提供了基本步骤...... 详情在这里:How to customize authentication to my own set of tables in asp.net web api 2?

这也是非常有价值的内容,同样适用于web api:

通过 JumpStart 自定义 ASP.NET 身份验证

https://channel9.msdn.com/Series/Customizing-ASPNET-Authentication-with-Identity

HTH

【讨论】:

YouTube 视频链接已失效。 有什么例子吗?此链接已失效。【参考方案2】:

其他有能力的人可以解释这些选项。但是如果身份验证作为服务是一个选项,那么请查看 Auth0 @ https://auth0.com

我已经使用 HTML/JS 和本机 Windows Phone 应用程序针对简单的 Sql Server 表和 AD 测试了该服务(作为 Azure 插件)。具有魅力,几乎零头痛。

【讨论】:

感谢您的回复。不幸的是,身份验证即服务不是我们的选择,因为我们希望将所有内容都保留在内部。必须与我们的内部遗留系统集成,自定义系统是一种痛苦,但我别无选择。 我一直在看 Auth0,它看起来不错,但我看不到如何将 Auth0 登录连接到现有用户的现有 SQL Server 数据库。你能对此有所了解吗? (这是在纯 Angular2 环境中,没有 ASP.Net MVC)。【参考方案3】:

我在尝试在 web api 中实现 json 令牌身份验证时偶然发现了我的解决方案。需要注意的是,我的解决方案通过 Http 请求的 Authentication 标头(不通过 cookie)和 使用 Microsoft.Identity 框架发送 json 令牌来处理身份验证。

无论如何,我基本上以食谱的方式实现了 Taiseer Joudeh 在这里描述的解决方案:http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/

要注意的关键是以下代码:

//Dummy check here, you need to do your DB checks against memebrship system http://bit.ly/SPAAuthCode
        if (context.UserName != context.Password)
        
            context.SetError("invalid_grant", "The user name or password is incorrect");
            //return;
            return Task.FromResult<object>(null);
        

您自然会用您自己的方法替换上面的这段代码,以检查您的(可能是预先存在的)用户数据库。一旦我实现了这一点,我意识到您不需要使用 Visual Studio 为您安装的新的代码优先身份框架。

为了完成这项工作,我做了以下工作:

1) 创建一个空项目并选择Change Authentication/Individual User Accounts。这将安装开箱即用所需的大部分参考和文件,以通过 cookie 以及代码优先身份框架文件使用令牌身份验证。

2) 在 Taiseer Joudeh 的带领下编辑了这些文件。这需要 一些新对象,例如 CustomOAuthProvider.cs 等。您需要通过自定义此代码块来实现自己的用户/密码检查:

if (context.UserName != context.Password) context.SetError("invalid_grant", "The user name or password is incorrect"); //return; return Task.FromResult<object>(null);

Taiseer Joudeh 说明链接:http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/

3) 修剪了我的项目中的无关文件(AccountBindingModels.cs、AccountViewModels.cs、IdentityModels.cs、ApplicationOAuthProvider.cs、identityConfig.cs、AccountBindingModels.cs、AccountViewModels.cs)。基本上,没有更多的微软身份参考。

我确信 microsoft.identity 非常棒,但是当我已经在使用一些不同结构的遗留数据库等时,我对数据库的代码优先实现感到恼火。希望这会有所帮助。我对结果非常满意(经过几天的折腾让它发挥作用)。

【讨论】:

【参考方案4】:

我不想使用任何现有的类,最后想出了一些非常简单的东西,比如

var userName = context.UserName;
var password = context.Password;
var userService = new UserService(); // our created one
var user = userService.ValidateUser(userName, password);
if (user != null)
   .......

在此处查看完整的详细信息OAuth Web API token base authentication with custom database

对于Role base authentication with custom database 希望对你有帮助

【讨论】:

【参考方案5】:

这对您来说可能是一种完全疯狂且无效的方法,但我面临着类似的挑战:新的 Web 应用程序(MVVM + WebAPI),用于发布和验证令牌的遗留系统。受http://tech.pro/tutorial/1216/implementing-custom-authentication-for-aspnet 的启发,并且因为我的应用程序主要由其随附的 GUI(MVVM webapp)使用,我决定使用由 FormsAuthentication 生成的“基于 cookie”的令牌。 FormsAutnentication cookie/ticket 由 .net 内部魔法安全保护(我假设 id 完全安全且牢不可破)。

在我的例子中,cookie 只是保存遗留系统发出的票证,(但您也可以在那里存储更多详细信息,例如通过 JSONSerializing 自定义类型)。在授权期间,我的系统根据旧系统验证令牌。我想您可以将类似的东西与自定义 AuthorizationFilter 一起使用。

【讨论】:

以上是关于使用自定义用户数据库进行 Web API 令牌身份验证的主要内容,如果未能解决你的问题,请参考以下文章

ASP Core 3.0 API 令牌自定义令牌身份验证(不是 jwt!)

如何自定义 ASP .NET Web API JWT 令牌响应?

使用 spotify-web-api-node 生成身份验证令牌

如何使 AzureAD 和自定义 JWT 令牌在 Web API 中并行工作?

Laravel 4 使用令牌进行身份验证

创建通过外部 API 进行身份验证的自定义身份验证提供程序?