繁体   English   中英

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

[英]Implementing Authentication and role based authorization in ASP.NET MVC web API service and MVC client architecture

在为我的Web API(服务)-MVC(客户端)体系结构项目实施身份验证/授权方案时,我很难决定一种方法。 即使我已经在Web API项目中实现了基于自定义令牌的身份验证,但我仍然很难在哪里确切地实现授权(在客户端或在API本身中)。


架构概述:

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

已实施身份验证:

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

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

当前问题:

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

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

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

要回答您当前的问题:

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

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

4我将始终使用授权标头发送授权数据。 在您的DelegatingHandler中(请注意不同的MessageHandler MVC,DelegatingHander HTTP),您可以通过simpy检索标头。

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

    return base.SendAsync(request, cancellationToken);
 }

有关如何在ajax调用中包括授权标头的更多信息,请参见: 如何在jQuery和AJAX中使用Basic Auth?

额外信息:

如果您是我,我还将看一下Thinktecture的Identity Server: https : //github.com/thinktecture/Thinktecture.IdentityServer.v2

也许这个答案关于REST服务的身份验证将帮助您还有: REST服务认证

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM