繁体   English   中英

具有自定义用户数据库的Web API令牌身份验证

[英]Web API token authentication with a custom user database

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

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

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

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

  • 创建一个实现IUser的自定义用户类
  • 定义实现public class UserStoreService : IUserStore<CustomUser>, IUserPasswordStore<CustomUser>的自定义用户存储public class UserStoreService : IUserStore<CustomUser>, IUserPasswordStore<CustomUser>
  • 把一切都搞定了

由于答案非常广泛,我只提供了基本步骤...详细信息如下: 如何在asp.net web api 2中自定义对我自己的表集的身份验证?

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

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

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

HTH

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

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

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

//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)创建一个空项目并选择更改身份验证/个人用户帐户 这将安装您开箱即用的大多数必需参考和文件,以便通过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非常好,但是当我已经使用了一些不同结构的遗留数据库时,我对代码优先实现数据库感到恼火。希望这会有所帮助。 我对结果非常满意(经过几天的努力才能让它发挥作用)。

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

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

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

在我的情况下,cookie只保存遗留系统发行的票证(但您也可以在那里存储更多细节,例如通过JSONSerializing自定义类型)。 在授权期间,我的系统会根据旧系统验证令牌。 我猜你可以和自定义的AuthorizationFilter一起使用类似的东西。

我不想使用任何现有的类,最后出来一些非常简单的事情

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令牌库身份验证

对于使用自定义数据库的角色基础认证希望它会有所帮

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM