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

标签 asp.net asp.net-mvc asp.net-mvc-4 asp.net-web-api asp.net-authorization

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

<小时/>

架构概述:

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

已实现身份验证:

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

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

当前问题:

  1. 授权应在哪一层实现?
  2. 如何在客户端保留用户角色?使用 Cookie?或将角色信息添加到 token 本身(这可能会增加 API 解密信息的开销以及额外的数据库调用以检索与该角色关联的权限)
  3. 应如何在客户端 session 中保留身份验证 token ?
  4. 由于我的应用程序是 SPA MVC 应用程序,因此将身份验证 token 包含在我对 API 进行的每个 AJAX 调用中的最佳方式是什么?
<小时/>

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

最佳答案

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

回答您当前的问题:

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

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

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

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

    return base.SendAsync(request, cancellationToken);
 }

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

额外信息:

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

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

关于asp.net - 在 ASP.NET MVC Web API 服务和 MVC 客户端架构中实现身份验证和基于角色的授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19661223/

相关文章:

asp.net-mvc-4 - 添加 Controller 时出现 nunit Framework not found 错误

asp.net-mvc - 何时在 MVC4 应用程序中使用 DTO(数据传输对象)?

c# - 如何通过jquery find函数获取所有asp隐藏字段控件id?

.net - 为 Visual Studio 安装 Razor View 引擎

jquery - ASP.MVC 不加载 jQuery 包

c# - razor 如何将字节 [8] 转换为字符串?

jquery - 下拉内容不起作用 (MVC)

c# - 在代码隐藏 asp.net 中默认选中的复选框列表项

包含某些正则表达式的 JavaScript 缩小失败

javascript - 在 ASP.NET MVC 中选择页面加载时的选项卡