继承ActionFilterAttribute并重写OnActionExecuting()方法
using log4net.Repository.Hierarchy;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.DirectoryServices;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Logger = WebAPI.Util.Logger;
namespace WebAPI.Models
{
/// <summary>
/// IExceptionFilter 异常拦截
/// ActionFilterAttribute 请求拦截器
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class BasicAuthAttribute : ActionFilterAttribute
{
/// <summary>
/// 在控制器执行之前调用
/// </summary>
/// <param name="context">执行的上下文</param>
public override void OnActionExecuting(ActionExecutingContext context)
{
// 判断是否加上了不需要拦截
string authHeader = context.HttpContext.Request.Headers["Authorization"];
if (authHeader != null && authHeader.StartsWith("Basic"))
{
//Extract credentials
string encodedUsernamePassword = authHeader.Substring("Basic ".Length).Trim();
Encoding encoding = Encoding.GetEncoding("iso-8859-1");
string usernamePassword = encoding.GetString(Convert.FromBase64String(encodedUsernamePassword));
int seperatorIndex = usernamePassword.IndexOf(':');
var username = usernamePassword.Substring(0, seperatorIndex);
var password = usernamePassword.Substring(seperatorIndex + 1);
if (!Regex.IsMatch(username, @"^[A-Za-z0-9_]+$"))
{
Logger.Log.ErrorFormat("Wrong user name format");
context.Result = new UnauthorizedResult();
return;
}
//if (IsAuthorized(username, password))
if (ValidateDomainUser(username, password))
{
Logger.Log.InfoFormat("Authorized, user []", username);
return;
}
else
{
Logger.Log.ErrorFormat("Unauthorized, user [] ", username);
context.Result = new UnauthorizedResult();
return;
}
}
else
{
Logger.Log.ErrorFormat("No Basic Auth Info");
context.Result = new UnauthorizedResult();
}
}
public bool ValidateUser(string accountName, string password)
{
//验证用户名密码
}
}
/// <summary>
/// 不需要登陆的地方加个这个空的拦截器
/// </summary>
public class NoSignAttribute : ActionFilterAttribute { }
}
在Controller层使用
[HttpGet("{ComponentMeta}")]
[BasicAuth]
public async Task<IActionResult> TestBasicAuth([FromRoute] string str)
{
}