【问题标题】:Cross platform authorization with Web API 2使用 Web API 2 进行跨平台授权
【发布时间】:2014-12-23 17:39:49
【问题描述】:

我有一个 WEB API 服务,我打算与从浏览器到移动应用程序再到 Windows 桌面客户端的客户端一起使用。我遇到的所有授权示例和文档都与使用声明(仅使用从浏览器发送的 cookie 有效?)以及通过控制对 MVC 控制器上某些操作方法的访问有关。

如何在 Web api 环境中为不仅仅是浏览器的客户端使用此类声明?我目前使用的令牌基本上是由我的网站生成的,因此我在对 web api 发出的每个请求上都发布了令牌。这目前仅适用于身份验证。但我不希望每个登录用户都能够从 html 中获取该令牌,并对他们无权访问的其他 web api 方法进行服务调用。我不希望通过这样的“黑客”获得这些数据。

对如何完成此操作有任何想法,还是我在此处的文档中遗漏了什么?

编辑

我想我应该提到这一点。我不想使用实体框架进行任何用户管理。在所有在线示例中,EF 似乎以某种方式与所有用户和声明管理紧密集成。

【问题讨论】:

    标签: security asp.net-web-api asp.net-web-api2 claims-based-identity


    【解决方案1】:

    我将尝试将您的问题分解为几个要考虑的关键部分。这是一个大主题,您可以将选项和变体应用于每个领域。如果您有 Pluralsight 帐户(或可以获得免费试用版),我建议您查看 Dominick Baier 的优秀 Web API v2 安全课程:http://www.pluralsight.com/courses/webapi-v2-security

    根据您支持一系列客户端的需要,我建议您从 OAuth 2.0 协议开始,并会进行更多说明。

    • 身份验证。 OAuth 2 不是身份验证协议,并且不规定您的应用程序如何处理身份验证。您可以选择使用任何安全方法,包括企业库应用程序块。 OAuth 2 和各种客户端类型的一种常见方法是使用基于 Web 的标准登录页面,该页面使用 ASP.NET 表单身份验证,该身份验证生成基于 cookie 的身份验证令牌。该 cookie 可以通过如下所述的令牌发布端点交换为 OAuth 2 不记名令牌。

    • 令牌生成。在生成用于调用受保护 API 的安全令牌时,需要考虑许多安全问题。我会鼓励使用现有的库或包来创建所谓的 OAuth 2“授权服务器”来安全地生成这些令牌。这可能包括使用 ASP.NET 身份 (http://www.asp.net/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server)、自托管的第三方授权服务器 (https://github.com/thinktecture/Thinktecture.IdentityServer.v3) 或第三方托管的授权服务器 (http://msdn.microsoft.com/library/hh147631.aspx)。

    • 授权。这是使用 OAuth 2 不记名令牌处理用户级别授权的两种主要方法。第一种是在令牌本身中嵌入声明或其他授权数据,第二种是使用令牌执行查找以检索此授权数据。如果基于角色的授权足以满足您的需求,您可能需要考虑将每个角色作为单独的声明包含在已发行的令牌中。这可能是最简单的解决方案,并允许使用 [Authorize] 属性来装饰 Web API 控制器和操作以强制执行授权:http://msdn.microsoft.com/en-us/library/system.web.http.authorizeattribute%28v=vs.118%29.aspx

    • 应用程序管理。 OAuth 2 协议要求为每个应用程序(通常是每个客户端类型)分配一个标识符和密钥。这些应用程序如何“注册”和分配这些凭据由您决定,但通常由您的授权服务器库或服务处理。

    • 令牌管理。 OAuth 2 不记名令牌的生命周期通常很短,一旦到期就必须重新颁发。使这更容易的一项功能称为“刷新令牌”,它允许客户端自动回收他们的不记名令牌以确保他们有一个活跃的令牌。

    您现在可能有比刚开始时更多的问题。我建议花一些时间来学习上面提到的 Pluralsight 课程、ASP.NET 身份文档和示例等资源。随着您更好地了解每个组件如何适应更大的图景,您可能需要根据自己的需要挑选特定元素。

    【讨论】:

    • 虽然这并不能直接回答我的问题,但它确实包含大量有助于找到合适解决方案的信息。因此将其标记为已接受。
    【解决方案2】:

    对于 Web API,您必须使用 OAuth 2.0 不记名访问令牌,对于 MVC,您必须使用 Cookie,不要在两者之间混用,Web API 将为您的移动客户端、SPA 应用程序提供服务,而 MVC 将为您的 Web 应用程序提供服务,如果你打算建造一个。您可以在此处阅读detailed 5 blog posts,它描述了如何使用 Web API 和身份构建简单的授权服务器。

    【讨论】:

    • 刚刚看到问题标题,我的第一个想法是去书签并获取指向您博客的链接:)
    • 您好,感谢您的链接和回复。如果我正确理解了这篇文章,我有几个问题似乎没有得到解决。 1.)它使用实体框架,我使用企业库进行所有数据访问,包括用户管理。抱歉,我之前没有提到这个要求。 2.) 特定的 API 方法如何知道附加了哪些声明?我没有看到 ClaimsAuthorizationManager 的实现或类似使用 ClaimsPrincipalPermission 属性装饰 Web API 方法的东西。
    • 那么令牌如何区分 MethodA 和 MethodB,其中这两种方法都需要只有具有有效声明的用户才能访问?例如。登录的用户 A 有一个令牌,通过该令牌他们只能访问 API MethodA 而不能访问 MethodB,因为 MethodA 属于所有登录用户都可以访问的只读列表,而 WebaPI MethodB 可能是只有系统管理员功能才能从前端。
    猜你喜欢
    • 1970-01-01
    • 2016-12-29
    • 2014-08-05
    • 2020-11-23
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    相关资源
    最近更新 更多