WebApi授权拦截——重写AuthorizeAttribute

31 篇文章 1 订阅

 跟mvc一样,webapi大多通过附加Authorize特性来实现授权,Authorize当授权失败时返回状态码:401。一般系统状态为401时,服务端就Redirect重定向到登录页。

    问题来了,我们的webapi在为富客户端ajax提供服务时,合理的做法是无论服务端发生什么情况,都尽可能给客户端返回json,才方便ajax回调函数解析。而重定向到登录了,则将返回登录页的一串html,ajax回调函数就傻傻的分不清楚啦。

    当然,解决办法是有的,思路为:重写Authorize的HandleUnauthorizedRequest,让服务端返回json,并且把状态码401改为其他状态码来避免被重定向。最合理的是改为403,表示服务器拒绝。

重写Authorize有以下几个要点需注意:

  1. HandleUnauthorizedRequest中基类方法已经将Response的状态设为”HttpStatusCode.Unauthorized(即401)“,重写时手请动改为”HttpStatusCode.Forbidden(即403)“,否则按401状态往下执行,就要被重定向到登录页;
  2. webApi下的授权筛选attribute为System.Web.Http.AuthorizeAttribute,而Mvc下用的是System.Web.Mvc.AuthorizeAttribute。这里别继承错了,否则授权筛选attrbute拦截不了。
  3. WebApi下Authorize.HandleUnauthorizedRequest的参数filterContext在此上下文里response还为空,需要手动创建。

    

以下是我重写的Authorize:

复制代码

 1  /// <summary>
 2     /// 重写实现处理授权失败时返回json,避免跳转登录页
 3     /// </summary>
 4     public class ApiAuthorize : AuthorizeAttribute
 5     {
 6         protected override void HandleUnauthorizedRequest(HttpActionContext filterContext)
 7         {
 8             base.HandleUnauthorizedRequest(filterContext);
 9 
10             var response = filterContext.Response = filterContext.Response ?? new HttpResponseMessage();
11             response.StatusCode = HttpStatusCode.Forbidden;
12             var content = new Result
13             {
14                 success = false,
15                 errs = new[] { "服务端拒绝访问:你没有权限,或者掉线了" }
16             };
17             response.Content = new StringContent(Json.Encode(content), Encoding.UTF8, "application/json");
18         }
19     }

复制代码

运行结果:

 

chrome下查看返回状态:

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ASP.NET WebAPI 是一种基于 HTTP 协议的 RESTful 风格的 Web 服务框架,它可以用来创建和提供 Web 服务。在 WebAPI 中实现登录和注销功能,需要涉及到用户认证和授权的相关知识。 下面是一个简单的 ASP.NET WebAPI 登录和注销的示例: 1. 首先需要创建一个控制器,例如名为 `AccountController` 的控制器。 2. 在 `AccountController` 中添加一个 `Login` 方法,用于处理用户登录的逻辑。在这个方法中,可以使用 ASP.NET Identity 进行用户认证,例如: ```csharp [HttpPost] public async Task<IHttpActionResult> Login(LoginViewModel model) { var user = await UserManager.FindAsync(model.Username, model.Password); if (user == null) { return BadRequest("Invalid username or password."); } var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); Authentication.SignIn(new AuthenticationProperties { IsPersistent = model.RememberMe }, identity); return Ok(); } ``` 3. 在 `AccountController` 中添加一个 `Logout` 方法,用于处理用户注销的逻辑。在这个方法中,可以使用 ASP.NET Identity 进行用户注销,例如: ```csharp [HttpPost] public IHttpActionResult Logout() { Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie); return Ok(); } ``` 4. 在 WebAPI 的配置文件 `WebApiConfig.cs` 中启用用户认证和授权: ```csharp public static void Register(HttpConfiguration config) { // 配置 Web API 路由 config.MapHttpAttributeRoutes(); // 启用用户认证和授权 config.Filters.Add(new AuthorizeAttribute()); // ... } ``` 以上就是一个简单的 ASP.NET WebAPI 登录和注销的示例。在实际开发中,还需要结合具体的业务逻辑进行完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值