Asp.Net WebApi 请求Token验证

WebAPI主要开放数据给手机APP,Pad,或其他需要请求数据的系统及应用软件。Web用户的身份验证,及页面操作权限验证是B/S系统的基础功能。

新建一个AuthToken.cs,继承AuthorizeAttribute重写基类的验证方式,重写HandleUnauthorizedRequest。示例中提供了两种验证方式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Web.Helpers;
using System.Web.Http;
using System.Configuration;

namespace Project.Example.WebApi.Filters
{
  /// <summary>
  /// 全局验证token
  /// </summary>
  [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
  public class AuthToken : AuthorizeAttribute
  {
    /// <summary>
    /// 重写基类的验证方式,加入我们自定义的Ticket验证  
    /// </summary>
    /// <param name="actionContext"></param>
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
      if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Count() > 0)
        return;
      //var host = actionContext.Request.Headers.Host;
      ////方式一
      //var authorization = actionContext.Request.Headers.Authorization;
      //if (authorization == null)
      //{
      //  ResponseErrorMsg(actionContext, "无效身份,请设置Authorization请求头");
      //  return;
      //}
      //if (!authorization.Scheme.Equals("Bearer"))
      //{
      //  ResponseErrorMsg(actionContext, "无效身份,请确保Authorization请求头值中以Bearer开头,格式:“Bearer KLeZicALNZcTK5cOmYkoQ7yHgegeeNEH5Btg1hGoM+XtP”");
      //  return;
      //}
      //string authkey = authorization.Parameter;
      //方式二
      //获取token(请求头里面的值)
      var authkey = System.Web.HttpContext.Current.Request.Headers["authkey"] ?? "";
      if (!string.IsNullOrEmpty(authkey))
      {
        //校验授权码是否正确
        string Secret = ConfigurationManager.AppSettings["ClientSecret"];
        if (Secret == authkey)
          base.IsAuthorized(actionContext);
        else
          //ResponseErrorMsg(actionContext, "Authorization请求头值不正确");
          ResponseErrorMsg(actionContext, "header中指定的authKey值不正确");

        //var host = actionContext.Request.RequestUri.Host;
        //var controllerName = actionContext.ControllerContext.ControllerDescriptor.ControllerName;
        //var actionName = actionContext.ActionDescriptor.ActionName;
      }
      else
      {
        //如果取不到authkey信息,并且不允许匿名访问,则返回未验证401  
        var anonymousAttributes = actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().OfType<AllowAnonymousAttribute>();
        if (anonymousAttributes.Count() == 0)
        {
          ResponseErrorMsg(actionContext, "header中必须指定authKey");
        }
        else
        {
          base.OnAuthorization(actionContext);
        }
      }
    }
    /// <summary>
    /// ResponseErrorMsg
    /// </summary>
    /// <param name="filterContext"></param>
    /// <param name="errorMsg"></param>
    protected void ResponseErrorMsg(System.Web.Http.Controllers.HttpActionContext filterContext, string errorMsg)
    {
      var response = filterContext.Response = filterContext.Response ?? new HttpResponseMessage();
      response.StatusCode = HttpStatusCode.Forbidden;
      var content = new
      {
        Success = false,
        Msg = errorMsg
      };
      response.Content = new StringContent(Json.Encode(content), Encoding.UTF8, "application/json");
    }
  }
}

总结

1、总体思路,如果是合法的Http请求,在Http请求头中会有用户身份的票据信息,服务端会读取票据信息,并校验票据信息是否完整有效,如果满足校验要求,则进行业务数据的处理,并返回给请求发起方;

2、如果没有票据信息,或者票据信息不是合法的,则返回“未授权的访问”异常消息给前端,由前端处理此异常。

3、登录的时候判断用户名跟密码对不对,对了就生成用户信息的Token,Session保存一个Token,BaseApiController里面的登录名跟Token也赋值了。保存这些票据信息。

4、当用户有权限操作页面或页面元素时,跳转到页面,并由页面Controller提交业务数据处理请求到api服务器; 如果用户没有权限访问该页面或页面元素时,则显示“未授权的访问操作”,跳转到系统异常处理页面。

5、 api业务服务处理业务逻辑,并将结果以Json 数据返回,返回渲染后的页面给浏览器前端,并呈现业务数据到页面;

参考博客:https://www.cnblogs.com/w5942066/p/12055542.html

posted @ 2024-01-04 18:55  以德为先  阅读(14)  评论(0)    收藏  举报