找回密码
 会员注册
查看: 117|回复: 0

ASP.NET WEBAPI 的身份验证和授权

[复制链接]

250

主题

1

回帖

819

积分

管理员

积分
819
发表于 2024-2-29 08:13:49 | 显示全部楼层 |阅读模式

定义

身份验证(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 的属性。
复制代码
  1. private void SetPrincipal(IPrincipal principal)
  2. {
  3. Thread.CurrentPrincipal = principal;
  4. if (HttpContext.Current != null)
  5. {
  6. HttpContext.Current.User = principal;
  7. }
  8. }
复制代码
复制代码

采用 web-hosting 时,必须同时设置两处,避免安全上下文不一致。对于 self-hosting,HttpContext.Current 为 null,所以设置之前应进行检查。

授权

授权发生在管道中更接近 controller 的位置。

  • 授权筛选器(Authorization filter)在 action 之前运行。若请求未授权,返回错误,action 不运行。
  • 在 action 内部,可以用 ApiController.User 属性获取主体对象,做进一步的控制。

[Authorize] 属性

AuthorizeAttribute 是内置的授权筛选器。用户未通过身份验证时,它返回 HTTP 401 状态码。可以在全局,控制和 action 三个级别应用它。

在全局级别应用:

  1. public static void Register(HttpConfiguration config)
  2. {
  3. config.Filters.Add(new AuthorizeAttribute());
  4. }
复制代码

在控制器级别应用:

复制代码
  1. [Authorize]
  2. public class ValuesController : ApiController
  3. {
  4. public HttpResponseMessage Get(int id) { ... }
  5. public HttpResponseMessage Post() { ... }
  6. }
复制代码
复制代码

在 Action 级别应用:

复制代码
  1. public class ValuesController : ApiController
  2. {
  3. public HttpResponseMessage Get() { ... }
  4. [Authorize]
  5. public HttpResponseMessage Post() { ... }
  6. }
复制代码
复制代码

在控制器上应用 [Authorize] 时,可以在 Action 上应用 [AllowAnonymous] 取消对某个 Action 的授权要求。上面的代码可以改成下面的形式:

复制代码
  1. [Authorize]
  2. public class ValuesController : ApiController
  3. {
  4. [AllowAnonymous]
  5. public HttpResponseMessage Get() { ... }
  6. public HttpResponseMessage Post() { ... }
  7. }
复制代码
复制代码

指定用户和角色进行限制:

复制代码
  1. // 按用户限制访问
  2. [Authorize(Users="Alice,Bob")]
  3. public class ValuesController : ApiController
  4. {
  5. }
  6. // 按角色限制访问
  7. [Authorize(Roles="Administrators")]
  8. public class ValuesController : ApiController
  9. {
  10. }
复制代码
复制代码

用于 WebAPI 的 AuthorizeAttribute 位于 System.Web.Http 命名空间。在 System.Web.Mvc 命名空间中有一个同名属性,不可用于 WebAPI。

自定义授权筛选器

可从以下类型派生自定义授权筛选器

  • AuthorizeAttribute,基于用户和角色进行授权。
  • AuthorizationFilterAttribute,不基于用户和角色的同步授权。
  • IAuthorizationFilter,实现此接口执行异步授权逻辑。例如,授权逻辑中有对 IO 或网络的异步调用。(CPU-bound的授权逻辑更适合从 AuthorizationFilterAttribute 派生,这样不必写异步方法)。

下图是 AuthorizeAttribute 类层次

在 Action 中执行验证

可在控制器中检查 ApiController.User 属性,根据用户和角色使用不同的逻辑。

复制代码
  1. public HttpResponseMessage Get()
  2. {
  3. if (User.IsInRole("Administrators"))
  4. {
  5. // ... }
  6. }
复制代码
复制代码

 

原文地址: http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api
来源:https://blog.csdn.net/orichisonic/article/details/80937386
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?会员注册

×
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-26 23:55 , Processed in 1.162378 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表