8

在为我的 Web API(服务)-MVC(客户端)架构项目实施身份验证/授权方案时,我很难决定一种方法。尽管我已经在 Web API 项目中实现了基于自定义令牌的身份验证,但我发现我应该在哪里实现授权(在客户端或 API 本身中)很难。


架构概述:

  • 项目解决方案-
    |
    | __ 基于 ASP.NET Web API 的 REST 服务(独立托管在 M/C 1 的 IIS 上)
    |
    | __ 基于 ASP.NET MVC 的客户端(独立托管在 IIS 上的 M/C 2 使用 REST 服务)
    |
    | __ 智能手机客户端应用程序(使用 REST 服务)

已实现身份验证:

  • Web API 中基于令牌的身份验证(使用消息处理程序)- 为经过身份验证的用户生成 SHA1 加密令牌,该令牌需要成为每个 http 请求标头的一部分以进行身份​​验证。
    (令牌 = 用户名 + 用户 IP)

  • SSL 保护的 HTTP 请求。(再次,使用消息处理程序)

当前问题:

  1. 授权应该在哪一层执行?
  2. 用户角色应该如何在客户端持久化?使用 Cookie?或将角色信息添加到令牌本身(这可能会增加 API 解密信息的开销和额外的数据库调用以检索与该角色关联的权限)
  3. 身份验证令牌应如何与客户端会话保持一致?
  4. 因为,我的应用程序是 SPA MVC 应用程序,将身份验证令牌作为我对 API 进行的每个 AJAX 调用的一部分包含在内的最佳方法是什么?

我希望,在考虑整个身份验证/授权概念时,我没有做错任何事情。因此,我将不胜感激任何替代方法/建议。

4

2 回答 2

3

首先,我认为发明自己的身份验证机制绝不是一个好主意。

要回答您当前的问题:

1一般来说,您总是希望使用身份验证来保护您的 Api,因为它是您访问数据的地方。您的客户端(MVC 应用程序/智能手机)应授权自己访问您的 Api。

2 & 3 由于您使用的是 REST Api,我建议您保持 Api 无状态,换句话说,不要保留任何会话信息。只需在您的 Token 中包含您需要的角色数据。例如,您可以使用JSON Web Token

4 我总是使用授权标头来发送授权数据。在您的 DelegatingHandler(注意 MessageHandler MVC、DelegatingHander HTTP 的区别)中,您可以简单地检索标头。

protected override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
 {
    var authorizationHeader = request.Headers.Authorization;
    // Your authorization logic.

    return base.SendAsync(request, cancellationToken);
 }

有关如何在 ajax 调用中包含授权标头的更多信息,请参阅:How to use Basic Auth with jQuery and AJAX?

额外信息:

如果我是你,我也会看看 Thinktecture 的身份服务器:https ://github.com/thinktecture/Thinktecture.IdentityServer.v2

也许这个关于 REST 服务身份验证的答案也会对您有所帮助: REST 服务身份验证

于 2013-10-29T15:39:48.107 回答
0

为什么要创建一个完整的令牌系统(除非您使用某种联合安全性)您有表单身份验证和 cookie,一旦设置并返回 cookie,浏览器将发送 cookie 以及您的 SPA 发出的任何 AJAX 请求。

于 2013-10-29T15:20:34.077 回答