经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
Fake权限验证小例子
来源:cnblogs  作者:敖毛毛  时间:2024/7/1 11:27:07  对本文有异议

前言

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

正文

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

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

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

有两个前置篇:

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

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

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

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

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

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

  1. public class FakeAuthenticationOptions : AuthenticationSchemeOptions
  2. {
  3. public virtual ClaimsIdentity Identity { get; set; }
  4. }

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

那么我们的handler就这样写:

  1. public class FakeAuthenticationHandler: AuthenticationHandler<FakeAuthenticationOptions>
  2. {
  3. public FakeAuthenticationHandler(
  4. IOptionsMonitor<FakeAuthenticationOptions> options,
  5. ILoggerFactory logger,
  6. UrlEncoder encoder,
  7. ISystemClock clock)
  8. : base(options, logger, encoder, clock)
  9. { }
  10. protected override Task HandleChallengeAsync(AuthenticationProperties properties)
  11. {
  12. return Task.CompletedTask;
  13. }
  14. protected override Task HandleForbiddenAsync(AuthenticationProperties properties)
  15. {
  16. return Task.CompletedTask;
  17. }
  18. protected override Task<AuthenticateResult> HandleAuthenticateAsync()
  19. {
  20. var principal = new ClaimsPrincipal(Options.Identity);
  21. var ticket = new AuthenticationTicket(principal, new AuthenticationProperties(), Scheme.Name);
  22. var result = AuthenticateResult.Success(ticket);
  23. return Task.FromResult(result);
  24. }
  25. }

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

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

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

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

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

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

  1. public static class FakeAuthenticationExtensions
  2. {
  3. public static AuthenticationBuilder AddFake(
  4. this AuthenticationBuilder builder,
  5. string scheme,
  6. Action<FakeAuthenticationOptions> configureOptions)
  7. =>
  8. builder.AddScheme<FakeAuthenticationOptions, FakeAuthenticationHandler>(
  9. scheme, scheme, configureOptions);
  10. }

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

  1. public class FakeScheme
  2. {
  3. public const string Default = "Fake";
  4. }

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

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

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

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

原文链接:https://www.cnblogs.com/aoximin/p/18258862

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号