C#进阶系列 WebApi身份认证解决方案推荐:Basic基础认证

2019-12-30 11:46:11于海丽

这里有一点需要注意的是,因为WebApi默认是没有开启Session的,所以需要我们作一下配置,手动去启用session。

正如上面的原理部分说的,登录如果失败,则直接返回;如果成功,则将生成的票据Ticket带到前端,传到主界面/Home/Index,下面,我们就来看看主界面Home/Index。

2、/Home/Index主界面


  public class HomeController : Controller
  {
    // GET: Home
    public ActionResult Index(string UserName, string Ticket)
    {
      ViewBag.UserName = UserName;
      ViewBag.Ticket = Ticket;
      return View();
    }
  }

<html>
<head>
  <meta name="viewport" content="width=device-width" />
  <title>Index</title>
  <script src="~/Content/jquery-1.9.1.js"></script>
  <link href="~/Content/bootstrap/css/bootstrap.css" rel="stylesheet" />
  <script src="~/Content/bootstrap/js/bootstrap.js"></script>
  <script src="~/Scripts/Home/Index.js"></script>
  <script type="text/javascript">
    //打开页面的时候保存票据信息
    var UserName = '@ViewBag.UserName';
    var Ticket = '@ViewBag.Ticket';
  </script>
</head>
<body>
  <div>当前登录用户:'@ViewBag.UserName'</div>

  <div id="div_test">

  </div>
</body>
</html>

$(function () {
  $.ajax({
    type: "get",
    url: "http://www.easck.com/pre>
	
	

这里需要说明的是,我们在发送ajax请求之前,通过 XHR.setRequestHeader('Authorization', 'BasicAuth ' + Ticket); 这一句向请求的报文头里面增加票据信息。就是因为这里加了这一句,所以才有我们下图中的红线部分:

C#,WebApi,身份认证

3、WebApiCORS验证部分(重点)

我们看到,上面的/Home/Index页面里面发送了ajax请求去访问服务的 http://www.easck.com//从http请求的头里面获取身份验证信息,验证是否是请求发起方的ticket var authorization = actionContext.Request.Headers.Authorization; if ((authorization != null) && (authorization.Parameter != null)) { //解密用户ticket,并校验用户名密码是否匹配 var encryptTicket = authorization.Parameter; if (ValidateTicket(encryptTicket)) { base.IsAuthorized(actionContext); } else { HandleUnauthorizedRequest(actionContext); } } //如果取不到身份验证信息,并且不允许匿名访问,则返回未验证401 else { var attributes = actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().OfType<AllowAnonymousAttribute>(); bool isAnonymous = attributes.Any(a => a is AllowAnonymousAttribute); if (isAnonymous) base.OnAuthorization(actionContext); else HandleUnauthorizedRequest(actionContext); } } //校验用户名密码(正式环境中应该是数据库校验) private bool ValidateTicket(string encryptTicket) { //解密Ticket var strTicket = FormsAuthentication.Decrypt(encryptTicket).UserData; //从Ticket里面获取用户名和密码 var index = strTicket.IndexOf("&"); string strUser = strTicket.Substring(0, index); string strPwd = strTicket.Substring(index + 1); if (strUser == "admin" && strPwd == "123456") { return true; } else { return false; } } }