在ASP.NET MVC Web API服务和MVC客户端体系结构中实现身份验证和基于角色的授权

vab*_*abz 8 asp.net asp.net-mvc asp.net-authorization asp.net-mvc-4 asp.net-web-api

在为我的Web API(服务) - MVC(客户端)架构项目实现身份验证/授权方案时,我很难确定方法.即使我已经在Web API项目中实现了基于自定义令牌的身份验证,但我发现很难确切地实现授权(在客户端或API本身).


架构概述:

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

已经实现了身份验证:

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

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

目前的问题:

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

我希望,考虑到整个身份验证/授权概念,我做错了.因此,我将不胜感激任何替代方法/建议.

Jos*_*nke 3

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

回答您当前的问题:

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

2 & 3 由于您使用的是 REST Api,我建议您保持 Api 无状态,换句话说,不要保留任何会话信息。只需将您需要的角色数据包含在您的令牌中即可。例如,您可以使用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);
 }
Run Code Online (Sandbox Code Playgroud)

有关如何在 ajax 调用中包含授权标头的更多信息,请参阅:如何通过 jQuery 和 AJAX 使用基本身份验证?

额外信息:

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

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