在为我的Web API(服务) – MVC(客户端)架构项目实现身份验证/授权方案时,我很难确定方法.即使我已经在Web API项目中实现了基于自定义令牌的身份验证,但我发现很难确切地实现授权(在客户端或API本身).
@H_502_2@架构概述:
@H_502_2@>项目解决方案 –
|
| __基于ASP.NET Web API的REST服务(在M / C 1上独立托管在IIS上)
|
| __基于ASP.NET MVC的客户端(独立托管在M / C 2上的IIS上,使用REST服务)
|
| __智能手机客户端应用程序(使用REST服务) @H_502_2@已经实现了身份验证: @H_502_2@> Web API中基于令牌的身份验证(使用消息处理程序) – 为经过身份验证的用户生成SHA1 encripted令牌,该令牌需要是每个http请求头的一部分以进行身份验证.
(令牌=用户名用户IP)
>受SSL保护的HTTP请求. (再次,使用消息处理程序) @H_502_2@目前的问题: @H_502_2@>在哪一层授权应该实施?
>如何在客户端保留用户角色?使用Cookies?或者向Token本身添加角色信息(这可能会增加API解密信息的开销和额外的DB调用以检索与该角色相关的权限)
>如何使用客户端会话保留身份验证令牌?
>因为我的应用程序是SPA MVC应用程序,将身份验证令牌作为我对API进行的每个AJAX调用的一部分包含的最佳方法是什么? @H_502_2@我希望,在考虑整个身份验证/授权概念时,我没有做错事.因此,我将不胜感激任何替代方法/建议.
|
| __基于ASP.NET Web API的REST服务(在M / C 1上独立托管在IIS上)
|
| __基于ASP.NET MVC的客户端(独立托管在M / C 2上的IIS上,使用REST服务)
|
| __智能手机客户端应用程序(使用REST服务) @H_502_2@已经实现了身份验证: @H_502_2@> Web API中基于令牌的身份验证(使用消息处理程序) – 为经过身份验证的用户生成SHA1 encripted令牌,该令牌需要是每个http请求头的一部分以进行身份验证.
(令牌=用户名用户IP)
>受SSL保护的HTTP请求. (再次,使用消息处理程序) @H_502_2@目前的问题: @H_502_2@>在哪一层授权应该实施?
>如何在客户端保留用户角色?使用Cookies?或者向Token本身添加角色信息(这可能会增加API解密信息的开销和额外的DB调用以检索与该角色相关的权限)
>如何使用客户端会话保留身份验证令牌?
>因为我的应用程序是SPA MVC应用程序,将身份验证令牌作为我对API进行的每个AJAX调用的一部分包含的最佳方法是什么? @H_502_2@我希望,在考虑整个身份验证/授权概念时,我没有做错事.因此,我将不胜感激任何替代方法/建议.
解决方法
首先,我认为发明自己的身份验证机制绝不是一个好主意.
@H_502_2@要回答您当前的问题:
@H_502_2@1一般来说,您总是希望使用身份验证来保护您的Api,因为它是您访问数据的地方.您的客户端(MVC应用程序/智能手机)应授权自己访问您的Api.
@H_502_2@2& 3
由于您使用的是REST Api,我建议您保持Api无状态,换句话说,不要保留任何会话信息.只需在令牌中包含您需要的角色数据即可.你可以使用例如JSON Web Token. @H_502_2@4
我总是使用授权标头来发送授权数据.在DelegatingHandler中(注意差异MessageHandler MVC,DelegatingHander HTTP),您可以简单地检索标头. @H_403_41@protected override Task<HttpResponseMessage> SendAsync( HttpRequestMessage request,CancellationToken cancellationToken) { var authorizationHeader = request.Headers.Authorization; // Your authorization logic. return base.SendAsync(request,cancellationToken); } @H_502_2@有关如何在ajax调用中包含授权标头的详细信息,请参阅:How to use Basic Auth with jQuery and AJAX? @H_502_2@额外信息: @H_502_2@如果我是你,我还会看一下Thinktecture的Identity Server:https://github.com/thinktecture/Thinktecture.IdentityServer.v2 @H_502_2@也许这个关于REST服务身份验证的答案也会对你有所帮助:
REST service authentication
由于您使用的是REST Api,我建议您保持Api无状态,换句话说,不要保留任何会话信息.只需在令牌中包含您需要的角色数据即可.你可以使用例如JSON Web Token. @H_502_2@4
我总是使用授权标头来发送授权数据.在DelegatingHandler中(注意差异MessageHandler MVC,DelegatingHander HTTP),您可以简单地检索标头. @H_403_41@protected override Task<HttpResponseMessage> SendAsync( HttpRequestMessage request,CancellationToken cancellationToken) { var authorizationHeader = request.Headers.Authorization; // Your authorization logic. return base.SendAsync(request,cancellationToken); } @H_502_2@有关如何在ajax调用中包含授权标头的详细信息,请参阅:How to use Basic Auth with jQuery and AJAX? @H_502_2@额外信息: @H_502_2@如果我是你,我还会看一下Thinktecture的Identity Server:https://github.com/thinktecture/Thinktecture.IdentityServer.v2 @H_502_2@也许这个关于REST服务身份验证的答案也会对你有所帮助:
REST service authentication