在ASP.NET(MVC5)web api项目中授权用户

时间:2017-10-09 05:17:42

标签: asp.net authentication

好的,所以我在尝试在我的ASP.NET MVC5(Web API 2)项目中获得身份验证过程时遇到了一些麻烦。首先,这里有一些要求:

  • 我无法使用实体框架(所有对数据库的访问都需要通过存储过程完成)
  • 需要定位.NET Framework 4.5.2
  • 我没有使用ASP.NET Core
  • 我希望能够使用Bearer(或类似)令牌进行身份验证
  • 如果用户退出或24小时后自动失效,我想使令牌无效
  • 我想在向"登录"发送请求时传递(和接收)XML。 (或"令牌")端点(请注意,理想情况下,解决方案应该尊重"内容类型"以及"接受"标头,所以如果我发送它JSON它应该以JSON响应,如果我发送XML,则应以XML格式响应)
  • 我不会很快(可能永远不会)使用外部提供商(例如Google)
  • 我想使用<Authorize>属性来帮助保护其他端点
  • 我正在使用VB.NET,虽然这个问题的答案可以在C#(我可以转换它们或重写它们以适应)
  • 我想将令牌存储在数据库中,这样我就可以记录哪些用户在API中做了什么

(请注意,我有很多原因可以改变上述情况)

我已尝试与Owin(OAuth)合作,但在将其与要求进行比较时,我发现了以下问题:

  • 我似乎无法发送令牌端点任何XML
  • 来自身份验证终端的响应(包括成功和不成功)都在JSON
  • 退出时我无法使令牌无效

如果这是最适合我想要的方式,我很乐意远离OAuth。我更愿意使用微软构建的nuget软件包(即没有第三方解决方案),或者我很乐意部分推出自己的解决方案(我想利用内置或微软构建的代码,包括身份和声明尽可能减少测试工作。

我已经阅读了大量关于此问题的StackOverflow问题并在互联网上搜索堆,但大多数文章都坚持使用OAuth,尽管存在上述问题或者它们依赖于EntityFramework。我当前的解决方案使用此处的代码(几乎在ApplicationOAuthProvider.GrantResourceOwnerCredentials()中复制/粘贴了一些自定义代码):https://www.codeproject.com/Articles/1187872/Token-Based-Authentication-for-Web-API-where-Legac

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我做了一些更广泛的研究,看起来OAuth不适合我的具体情况。虽然它看起来像一个很好的身份验证方法,但我真的需要通过数据库使令牌无效,我需要API始终发送/接收XML(这些在使用OAuth时显然不适用)。

为了解决这些问题,我已经推出了自己的基于令牌的解决方案,在客户端创建了一个散列令牌,所以我从不通过线路发送密码(这有点好一点),因为令牌是在客户端(请注意,我正在控制客户端发生的事情 - 这些都是内部客户端,我正在编写这些客户端将使用的库)。这涉及到我创建自己的过滤器,该过滤器继承System.Web.Http.AuthorizeAttribute

如果有人偶然发现这个问题并提供了一个非常好的答案,我很乐意将他们的标记视为已被接受。