• Fake权限验证小例子


    前言

    关于本地测试如何进行Fake权限验证

    正文

    在我们使用swagger调试本地接口的时候,我们常常因为每次需要填写token而耽误工作,不可能每次调试的时候都去本地测试环境请求一个token进行验证吧。

    上图可能是我们本地测试的时候需要填写的一个token位置,本地测试不方便。

    那么怎么伪造权限验证通过呢?

    有两个前置篇:

    1. https://www.cnblogs.com/aoximin/p/15582365.html
    2. https://www.cnblogs.com/aoximin/p/15613974.html

    通过这两个前置篇的阅读,可能马上就能知道下面表达所在了,但是及时不看也没用过关系。

    在.net 框架验证的时候呢?

    我们可以加入自己的验证方案的。

      public virtual AuthenticationBuilder AddScheme<TOptions, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] THandler>(string authenticationScheme, string? displayName, Action? configureOptions)
          where TOptions : AuthenticationSchemeOptions, new()
          where THandler : AuthenticationHandler
          => AddSchemeHelper(authenticationScheme, displayName, configureOptions);
    

    也就是说,我们可以自定义验证方案,那么我们加入我们的Fake 方案,即可通过。

    public class FakeAuthenticationOptions : AuthenticationSchemeOptions
    {
        public virtual ClaimsIdentity Identity { get; set; }
    }
    

    在Fake选项中加入了ClaimsIdentity,这个Identity 就是我们要伪造的用户信息。

    那么我们的handler就这样写:

    public class FakeAuthenticationHandler: AuthenticationHandler<FakeAuthenticationOptions>
    {
        public FakeAuthenticationHandler(
            IOptionsMonitor options, 
            ILoggerFactory logger, 
            UrlEncoder encoder, 
            ISystemClock clock) 
            : base(options, logger, encoder, clock)
        { }
    
    
        protected override Task HandleChallengeAsync(AuthenticationProperties properties)
        {
            return Task.CompletedTask;
        }
    
        protected override Task HandleForbiddenAsync(AuthenticationProperties properties)
        {
            return Task.CompletedTask;
        }
    
        protected override Task HandleAuthenticateAsync()
        {
            var principal = new ClaimsPrincipal(Options.Identity);
            var ticket = new AuthenticationTicket(principal, new AuthenticationProperties(), Scheme.Name);
            var result = AuthenticateResult.Success(ticket);
    
            return Task.FromResult(result);
        }
    }
    

    因为我们伪造信息是为了通过验证,那么Challenge(401)和Forbidden(403)我们直接Task.CompletedTask,不会出现这种情况。

    那么我们认证的时候这样写HandleAuthenticateAsync:

    1. 将伪造的信息生成ticket
    2. 将ticket注入到认证结果中去
    3. 返回认证结果

    这个时候我们就伪造了认证的信息。

    注意:授权是通过认证的信息进行授权的,那么我们伪造了认证的信息其实就是为了骗过授权。

    然后我们将认证作为中间件进行封装成中间件模样:

    public static class FakeAuthenticationExtensions
    {
        public static AuthenticationBuilder AddFake(
            this AuthenticationBuilder builder, 
            string scheme,
            Action configureOptions)
            =>
                builder.AddScheme(
                    scheme, scheme, configureOptions);
    }
    

    那么这个时候最好再加一个默认的方案名:

    public class FakeScheme
    {
        public const string Default = "Fake";
    }
    

    那么我们注入scheme的时候就这样即可:

    builder.AddFake(FakeScheme.Default, u =>
    {
    	List<Claim> claims = new List<Claim>();
    	var userId = configuration.GetValue<string>("AuthServer:FakeUser");
    	claims.Add(new Claim(ClaimTypes.NameIdentifier, userId));
    	u.Identity = new ClaimsIdentity(claims, "Role");
    });
    

    这样就伪造了认证的信息了,然后这个claims根据自己的验证需要进行动态调整即可。

    上面简述了如何去伪造认证信息,用于本地测试,预发或者线上通过环境变量或者配置关闭即可。

  • 相关阅读:
    SpringCloud集成OpenFeign,轻松RPC
    C++模板初阶 —— 函数模板、类模板、模板的声明和定义分离(多文件使用的注意事项)
    MySQL索引
    LNMP架构之搭建Discuz论坛
    美容院开业活动方案
    SpringBoot 前端406 后端Could not find acceptable representation
    关于 ELEMENTOR 的常见问题
    王道数据结构——链队列
    string类型常用命令与其底层数据结构
    openGauss学习笔记-92 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用MOT SQL覆盖和限制
  • 原文地址:https://www.cnblogs.com/aoximin/p/18258862