实施基于令牌的自定义授权/身份验证系统

时间:2018-12-03 22:37:55

标签: c# authentication asp.net-core authorization

我正在尝试将我们的解决方案之一从Laravel / PHP系统迁移到基于.Net Core 2的系统。我的主要问题是关于授权和认证。

我有5种不同的应用程序将REST查询发送到Api(例如,Web浏览器,iOS应用程序,Android应用程序等),而我目前处理身份验证/授权的方式如下:

  1. 用户发送用户名/密码以及应用程序ID(例如“浏览器”,“ iOS”等)和应用程序描述(例如“ Chrome-Jacob”,“ iPhone-7-Jacob”) 。
  2. 如果一对应用程序ID /应用程序描述中已经存在令牌,则将其返回。否则,将生成一个新令牌并将其保存在名为“令牌”的数据库表中。
  3. 每个令牌可以具有不同的权限矩阵,该矩阵非常精细(例如,“用户/ ViewAll”,“用户/创建”,“用户/ ViewOne”,“用户/ ViewMe”等)
  4. 当接收到带有标头中的令牌的REST查询时,我们在数据库中查找令牌的权限矩阵,并尝试查看要访问的预期功能是否得到授权。

似乎在Core 2中,令牌的预期用途是通过JWT。我对这种方法不是100%满意的,因为我希望用户能够看到为其访问生成的所有令牌,所有关联的权限以及简单地撤消对令牌的访问的能力。而对于JWT,只有在他们通过请求发送令牌的情况下,才知道谁拥有令牌。

我当前的实现可以生成任何随机令牌,只要它在数据库中是唯一的即可;不需要任何加密算法。

在Core 2中复制上述系统的最佳方法是什么?

我发现Microsoft的方法非常适合简单的应用程序,但是我正在努力重写Authorize Attribute并获得我希望的粒度。

1 个答案:

答案 0 :(得分:1)

  

我发现Microsoft的方法非常适合简单的应用程序,但是我正在努力重写Authorize Attribute并获得我希望的粒度。

那是完全相反的。微软没有发明也没有接近第一个开始使用JWT的人。您已经采用了一些非常普遍的方法并制作了自己的版本,而这种方法不被认为是安全的,也不是一种好的做法。

有两种方法可以解决当前的问题:

  1. 使用Identity Server 4,这是一个由ASP.NET Core开发的免费开源系统,由经验丰富的安全人员开发,它为您提供可自定义的OAuth 2.0 / OpenID Connect系统。这样,您就需要对应用程序安全性的某些部分进行重做,但是您将使用行业标准。
    注意:这可能不太容易,但是扩展性非常好

    身份服务器已经为您提供了有关每个应用程序的所有信息,以及哪些令牌对哪些应用程序有效。

  2. 虽然您可以手工完成此操作,但又不会遇到太多麻烦,但我建议您看一下ASP.NET Core Identity,这是ASP.NET Core中身份验证和授权的官方框架。注意,关于如何知道哪些令牌/登录处于活动状态,Identity最近采用了两个有趣的表:

    • IdentityUserLogin:告诉您哪些用户在何处/如何登录
    • IdentityUserToken:为您提供已为给定用户提供的令牌。

所有这些,通常将ASP.NET Core Identity添加到Identity Server 4应用程序中,因为后者不用于处理授权。