ASP.NET Core使用请求拦截器ActionFilterAttribute进行Basic Auth验证

继承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)
{
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值