使用自定义用户数据库的Web API令牌authentication

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

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

有没有一种方法可以将现有的框架(如OAuth2)集成到我当前的项目中? 我不知道是否有任何区别,但我使用OWIN自我托pipe。

编辑:我不知道为什么有几个人低估了这个问题 – 这真的是不好的? 就我而言,这是一个真正的问题,我希望能有一个答案(即使是“ 不,你不能这样做,因为…… ”)。 如果这些人可以在评论中解释他们的理由,那将是值得赞赏的。

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

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

由于答案是相当广泛的,我只是提供了基本的步骤…细节在这里: 如何自定义身份validation到我自己的一套表在asp.net web api 2?

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

使用JumpStart自定义身份validation的ASP.NET身份validation

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

HTH

我偶然发现了一个解决scheme,同时试图在web api中实现json令牌authentication。 需要注意的是,我的解决scheme通过发送一个JSON令牌来处理authentication,通过Http请求的Authentication头( 而不是通过cookie )并且使用Microsoft.Identity框架。

无论如何,我基本上以一本食谱的方式实施Taiseer Joudeh在这里描述的解决scheme: 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); } 

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

为了使这个工作,我做了以下几点:

1)创build一个空的项目,并select更改authentication/个人用户帐户 。 这将安装绝大多数需要的引用和文件,以便通过Cookie以及代码优先的身份框架文件使用令牌身份validation。

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是非常好的,但是当我已经使用了一些不同结构的遗留数据库时,我对数据库的代码优先实现感到恼火。希望这有助于。 我对这个结果非常满意(经过几天的努力才得以实现)。

有其他人,有能力,可以解释的select。 但是,如果authentication服务是一个选项,那么请查看Auth0 @ https://auth0.com

我已经使用HTML / JS和本地Windows Phone应用程序对简单的Sql Server表和AD进行了testing(作为Azure插件)。 作品魅力,近乎零头痛。

这可能是一个完全疯狂和无效的方法,但我面临着类似的挑战:新的Web应用程序(MVVM + WebAPI),遗留系统用于发行和validation令牌。 受到http://tech.pro/tutorial/1216/implementing-custom-authentication-for-aspnet的启发,并且由于我的应用程序主要由其附带的GUI(MVVM web应用程序)使用,所以我决定使用“基于cookie “由FormsAuthentication生成的令牌。 FormsAutnentication的cookie /票据由.net内部的魔法安全保护(我认为id完全安全并且牢不可破)。

在我的情况下,cookie只保存遗留系统发出的票据(但是您也可以在那里存储更多细节,例如通过JSONSerializing自定义types)。 在授权期间,我的系统将对照旧版系统validation令牌。 我想你可以使用一个类似的东西一个自定义的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令牌基础身份validation与自定义数据库

希望它能帮助别人