ASP.NET WEBAPI 的身份验证和授权 2022-05-21 11:19 1043阅读 0赞 ## 定义 ## 身份验证(Authentication):确定用户是谁。 授权(Authorization):确定用户能做什么,不能做什么。 ## 身份验证 ## WebApi 假定身份验证发生在宿主程序称中。对于 web-hosting,宿主是 IIS。这种情况下使用 HTTP Module 进行验证。 验证时,宿主会创建一个表示安全上下文的主体对象(实现 IPrincipal),将它附加到当前线程。主体对象包含一个存储用户信息的 Identity 对象。若验证成功,Identity.IsAuthenticated 属性将返回 true。 ### HTTP 消息处理程序(HTTP Message Handler) ### 可以用 HTTP 消息处理程序代替宿主进行身份验证。这种情况下,由 HTTP 消息处理程序检查请求并设置主体对象。 请考虑以下事项决定是否使用消息处理程序进行身份验证: * HTTP 模块检查所有经过 asp.net 管道的请求,消息处理程序只检查路由到 WebAPI的请求。 * 可以为每个路由单独设置消息处理程序。 * HTTP 模块仅在 IIS 中可用。消息处理程序则与宿主无关,在 web-hosting 和 self-hosting 中均可用。 * HTTP 模块参与IIS 日志和审计等功能。 * HTTP模块在管道之前运行,主体在消息处理程序运行之前不会设置,当响应离开 消息处理程序时,主体会恢复成原来的那个。 一般来说,不需要自承载时,HTTP 模块较好。 ### 设置主体 ### 进行自定义身份验证时,应在两个地方设置主体对象: * Thread.CurrentPrincipal,这是 .net 中设置线程主体的标准方式。 * HttpContext.Current.User 这是特定于 ASP.NET 的属性。 ![复制代码][copycode.gif] private void SetPrincipal(IPrincipal principal) { Thread.CurrentPrincipal = principal; if (HttpContext.Current != null) { HttpContext.Current.User = principal; } } ![复制代码][copycode.gif] 采用 web-hosting 时,必须同时设置两处,避免安全上下文不一致。对于 self-hosting,HttpContext.Current 为 null,所以设置之前应进行检查。 ## 授权 ## 授权发生在管道中更接近 controller 的位置。 * 授权筛选器(Authorization filter)在 action 之前运行。若请求未授权,返回错误,action 不运行。 * 在 action 内部,可以用 ApiController.User 属性获取主体对象,做进一步的控制。 ### \[Authorize\] 属性 ### AuthorizeAttribute 是内置的授权筛选器。用户未通过身份验证时,它返回 HTTP 401 状态码。可以在全局,控制和 action 三个级别应用它。 在全局级别应用: public static void Register(HttpConfiguration config) { config.Filters.Add(new AuthorizeAttribute()); } 在控制器级别应用: ![复制代码][copycode.gif] [Authorize] public class ValuesController : ApiController { public HttpResponseMessage Get(int id) { ... } public HttpResponseMessage Post() { ... } } ![复制代码][copycode.gif] 在 Action 级别应用: ![复制代码][copycode.gif] public class ValuesController : ApiController { public HttpResponseMessage Get() { ... } [Authorize] public HttpResponseMessage Post() { ... } } ![复制代码][copycode.gif] 在控制器上应用 \[Authorize\] 时,可以在 Action 上应用 \[AllowAnonymous\] 取消对某个 Action 的授权要求。上面的代码可以改成下面的形式: ![复制代码][copycode.gif] [Authorize] public class ValuesController : ApiController { [AllowAnonymous] public HttpResponseMessage Get() { ... } public HttpResponseMessage Post() { ... } } ![复制代码][copycode.gif] 指定用户和角色进行限制: ![复制代码][copycode.gif] // 按用户限制访问 [Authorize(Users="Alice,Bob")] public class ValuesController : ApiController { } // 按角色限制访问 [Authorize(Roles="Administrators")] public class ValuesController : ApiController { } ![复制代码][copycode.gif] 用于 WebAPI 的 AuthorizeAttribute 位于 System.Web.Http 命名空间。在 System.Web.Mvc 命名空间中有一个同名属性,不可用于 WebAPI。 ### 自定义授权筛选器 ### 可从以下类型派生自定义授权筛选器 * AuthorizeAttribute,基于用户和角色进行授权。 * AuthorizationFilterAttribute,不基于用户和角色的同步授权。 * IAuthorizationFilter,实现此接口执行异步授权逻辑。例如,授权逻辑中有对 IO 或网络的异步调用。(CPU-bound的授权逻辑更适合从 AuthorizationFilterAttribute 派生,这样不必写异步方法)。 下图是 AuthorizeAttribute 类层次 ### 在 Action 中执行验证 ### 可在控制器中检查 ApiController.User 属性,根据用户和角色使用不同的逻辑。 ![复制代码][copycode.gif] public HttpResponseMessage Get() { if (User.IsInRole("Administrators")) { // ... } } ![复制代码][copycode.gif] 原文地址: [http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api][http_www.asp.net_web-api_overview_security_authentication-and-authorization-in-aspnet-web-api] [copycode.gif]: /images/20220521/8ba8864b9edb45c5ac2321b4e5ad8bdb.png [http_www.asp.net_web-api_overview_security_authentication-and-authorization-in-aspnet-web-api]: http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api
相关 Spring中的Websocket身份验证和授权 一、需要了解的事项 http和WebSocket的安全链和安全配置是完全独立的。 SpringAuthenticationProvider根本不参与 Webs 男娘i/ 2023年10月14日 23:01/ 0 赞/ 2 阅读
相关 Java Shiro:简化身份验证和授权的安全框架 在当今的软件开发中,安全性是一个重要的关注点。为了保护应用程序和用户数据,开发人员需要实施强大的身份验证和授权机制。Java Shiro是一个强大而灵活的安全框架,可以帮... 原创先锋/ 2023年05月31日 00:17/ 25 赞/ 2603 阅读
相关 WebService身份验证 Web Service身份验证解决方案一:通过通过SOAP Header身份验证。 1.我们实现一个用于身份验证的类,文件名MySoapHeader.cs MySoapHe 朱雀/ 2022年08月02日 12:44/ 0 赞/ 153 阅读
相关 Shiro ---身份认证、授权 Subject 认证主体 1.身份认证流程: ![Center][] > > 2.Realm&JDBC Reaml > > > Subject 谁借莪1个温暖的怀抱¢/ 2022年07月16日 08:22/ 0 赞/ 1093 阅读
相关 Web用户的身份验证及WebApi权限验证流程的设计和实现 [Web用户的身份验证及WebApi权限验证流程的设计和实现][Web_WebApi] 2013-12-03 14:42 32033人阅读 [评论][Link 逃离我推掉我的手/ 2022年07月13日 15:28/ 0 赞/ 261 阅读
相关 WebApi实现验证授权Token,WebApi生成文档等 1. using System; 2. using System.Linq; 3. using System.Web; 4. using System.We Myth丶恋晨/ 2022年06月06日 07:57/ 0 赞/ 193 阅读
相关 ASP.NET WEBAPI 的身份验证和授权 定义 身份验证(Authentication):确定用户是谁。 授权(Authorization):确定用户能做什么,不能做什么。 身份验证 WebApi 假定 本是古典 何须时尚/ 2022年05月21日 11:19/ 0 赞/ 1044 阅读
相关 MongoDB用户和身份验证 [MongoDB][]是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。这里推荐一个快速入门教程 - [8天学通 MongoDB][ 一时失言乱红尘/ 2022年04月16日 02:13/ 0 赞/ 252 阅读
相关 HTTP 身份验证 HTTP 提供一个用于权限控制和认证的通用框架。最常用的HTTP认证方案是HTTP Basic authentication。本页介绍了通用的HTTP认证框架以及展示如何通过H Bertha 。/ 2021年12月11日 05:39/ 0 赞/ 467 阅读
相关 目录身份验证 此示例展示 ASP.NET Forms 身份验证可能的最简单的实现。它旨在于阐释有关如何创建使用 Forms 身份验证的 ASP.NET 应用程序的基础知识。有关使用 XML 亦凉/ 2021年11月01日 08:36/ 0 赞/ 311 阅读
还没有评论,来说两句吧...