asp.net-web-api - Web Api 2 OData 端点中的简单 Web token (SWT) 身份验证

标签 asp.net-web-api odata

好吧,情况是这样的。

我们已经拥有一个现有的 ASP.NET MVC 5 站点,具有自定义表单例份验证、登录、注册等功能,以及已实现的角色和配置文件的自定义数据库。

我们现在正在向 MVC 站点添加一些新功能,并决定使用位于另一个域中的 Web Api 2 OData 3 端点。 Web Api 目前不包含任何身份验证,但我们需要能够将请求映射到某个用户,以从后端获取他的角色等。 MVC 和 API 站点使用相同的后端。

我们想要实现的是,当用户登录 MVC 站点时,MVC 站点使用用户的凭据调用 Web Api 服务器到服务器,并接收客户端可以用来调用的 token Web 服务。

当API收到带有 token 的请求时,它可以将请求与后端的用户映射并进行授权。

据我了解,Simple Web Token (SWT) 可以解决这个问题。但考虑到环境,.NET 4.5.1/Web Api 2/OData 3 以及 Azure Web 角色中的 Entity Framework ,我开始思考这个 SWT 是我真正应该使用的东西,还是最近发布的任何新技术可以轻松实现这一点通过。如果 .NET 堆栈已包含类似的内容,我不想向项目添加任何不必要的第三方依赖项。

那么,在不向项目添加不必要的依赖项的情况下完成这种身份验证的最简单方法是什么。

我们正在寻找的解决方案只是暂时的,同时我们重新设计了我们的身份验证方案。因此,我们正在寻找一些非常简单的实现方式,并且具有最少的依赖项,稍后需要删除这些依赖项。

最佳答案

我正在我当前正在进行的项目中使用它。我使用 Web API 2.0 附带的 OAuth 2.0 OWIN 中间件组件(如果您添加启用了身份验证的新 Web API 项目,它包括基础基础设施)。

您将使用 OAuth 2.0 规范中定义的资源所有者密码流程。基本上,您从 Web API OWIN 中间件发送请求 token :

  • client_id - 标识您的 MVC 端点
  • client_secret - 标识您的 MVC 端点
  • 用户名
  • 密码

作为回应,你会得到一个不记名 token 。 token 生成基于声明主体,OAuth 中间件组件具有用于添加声明的预定义 Hook 。现在需要将此 token 作为授权 header 添加到每个响应中。在 MVC 方面,您可以将其添加到 session 中,以便始终可以在与传入 HTTP 请求关联的用户上下文中进行后端 API 调用。如果您使用的是 WCF 数据服务客户端,则需要一个授权服务/管理器或类似的服务,您可以将其挂接到 OnRequestSending 和 OnResponseReceived 事件中,以便可以将该不记名 token 插入到 HTTP header 中。

您可以根据需要轻松自定义 OAuth 中间件组件,花了一些时间才弄清楚它,因为它没有很好的文档记录,但是下载 Katana 源代码确实有一点帮助,因为源代码确实有一些好的文档。

这一切的好处是,您只需启用 HostAuthenticationFilter 并在 Web API 端添加 Authorize 属性,然后就可以开始使用了。您可以访问声明主体对象并使用声明作为用户的识别信息 - 例如身份、角色、其他属性等

要开始使用,请查看 http://www.asp.net/vnext/overview/authentication/individual-accounts-in-aspnet-web-api

此外,我确实考虑使用 JSON Web token (JWT),因为有一个 OWIN 库可用于生成和解析这些 token 。这里的用例是您进行身份验证,获取 JWT,然后使用 JWT 获取 OAuth 2.0 不记名 token 。如果您想要将身份验证转移到其他地方,或者想要在 MVC 方面获取有关用户的其他信息,JWT 会非常有用。

关于asp.net-web-api - Web Api 2 OData 端点中的简单 Web token (SWT) 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20398564/

相关文章:

javascript - Kendo UI 网格无法与启用 asp.net web api odata 的服务正常工作

OData 过滤器嵌套查询

c# - +(加号)登录 Web API 路由

c# - 未找到 Web Api Content.ReadAsAsync 方法,但代码编译

odata - 有谁知道一个好的 OData 浏览器?

c# - OData v4 groupby 带日期

c# - ASP.NET MVC WebAPI 从异步任务创建 ViewModel

c# - WebAPI OData $格式到 xml

c# - 任何人都可以向我解释 CreatedAtRoute() 吗?

c# - Microsoft.OData.Client.DataServiceCollection<T> 异常 : Entity set name has not been provided for an entity of type