首页 > 其他分享 >Fake权限验证小例子

Fake权限验证小例子

时间:2024-06-30 22:20:04浏览次数:1  
标签:Task 验证 认证 Fake new 权限 public

前言

关于本地测试如何进行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<TOptions>? configureOptions)
      where TOptions : AuthenticationSchemeOptions, new()
      where THandler : AuthenticationHandler<TOptions>
      => AddSchemeHelper<TOptions, THandler>(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<FakeAuthenticationOptions> 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<AuthenticateResult> 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<FakeAuthenticationOptions> configureOptions)
        =>
            builder.AddScheme<FakeAuthenticationOptions, FakeAuthenticationHandler>(
                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根据自己的验证需要进行动态调整即可。

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

标签:Task,验证,认证,Fake,new,权限,public
From: https://www.cnblogs.com/aoximin/p/18258862

相关文章

  • leetCode.98. 验证二叉搜索树
    leetCode.98.验证二叉搜索树题目描述代码/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*TreeNode(intx......
  • 验证二叉搜索树 前序 中序 后序的三种解法 - 灵神视频总结
    这节课用三种方法来验证一颗二叉树是否是搜索树。递归的基础知识:看到递归就晕?带你理解递归的本质!--灵神视频总结-CSDN博客如何灵活运用递归?-灵神视频总结-CSDN博客98.验证二叉搜索树二叉搜索树的定义:给你一个二叉树的根节点root,判断其是否是一个有效的二叉搜索树......
  • git检查别人提交的PR(pull requests)并在本地验证,然后合并
    可以看官方流程:Checkingoutpullrequestslocally-GitHubDocs当别人给你的开源仓库提交了pullrequest,你该怎么检查别人提交的代码是否可用,然后合并上去呢?今天我就遇到了,就在前不久开源项目douyin-live失败了,需要开启signature字段校验,研究了两天后发现需要使用浏览器......
  • 个人前后端权限理解篇
    前端权限前端权限是基于后端配合的基础上进行实现的,很多数据需要后端进行提供。前端权限主要通过以下几个方面进行控制,后端通过接口进行配合:菜单控制可以通过后端返回相应身份的权限进行前端渲染,主要在登录后完成相关部分控制。登录后可将相关数据保存在localStorage或者是se......
  • mysql 如何分配root账号创建数据库的权限
    1.mysql如何分配root账号创建数据库的权限在MySQL中,root用户通常具有所有的权限,包括创建数据库的权限。但是,如果我们想要为另一个用户分配创建数据库的权限,或者想要限制root用户对某个特定数据库或服务器的权限(尽管这在实际操作中并不常见,因为root用户通常应该是无限制的......
  • mysql 如何分配root账号创建数据库的权限
    1.mysql如何分配root账号创建数据库的权限在MySQL中,root用户通常具有所有的权限,包括创建数据库的权限。但是,如果我们想要为另一个用户分配创建数据库的权限,或者想要限制root用户对某个特定数据库或服务器的权限(尽管这在实际操作中并不常见,因为root用户通常应该是无限......
  • 如何开启MySQL远程访问权限允许远程连接?
    如何开启MySQL远程访问权限允许远程连接? 当需要允许远程连接MySQL时,你可以按照以下方法进行配置:1.改表法:如果你的MySQL帐号仅允许在本地登陆,而不允许远程登陆,你可以通过更改\mysql\数据库中的\user\表来修改\host\项。-在本地MySQL中,执行以下命令:mysql-uroot-p-进......
  • Linux 文件权限
    优质博文:IT-BLOG-CN一、使用者与群组的概念【1】在Linux里面,任何一个文件都具有[User,Group及Other]三种身份的个别权限:不过需要注意的是root用户,具有所有权限。✔User(文件拥有者):只有文件拥有者,就是你自己,才能看与修改这个文件的内容;✔Group(群组的概念):群组是最有......
  • 代码随想录算法训练营第18天 | 、98验证二叉树、700. 二叉搜索树中的搜索
    代码随想录算法训练营第20天|654.最大二叉树https://leetcode.cn/problems/maximum-binary-tree/654.最大二叉树代码随想录https://programmercarl.com/0654.最大二叉树.html617.合并二叉树https://leetcode.cn/problems/merge-two-binary-trees/description/617.合并二......
  • Leetcode 力扣 125. 验证回文串 (抖音号:708231408)
    如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。字母和数字都属于字母数字字符。给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。示例1:输入:s="Aman,aplan,......