.net blazor如何在服务器端添加假认证?/API

6qqygrtg  于 2023-03-09  发布在  .NET
关注(0)|答案(2)|浏览(165)

因此,我有一些客户端Blazor应用程序,它使用OIDC外部认证的“生产”版本,但在开发过程中,OIDC很慢,我不想等待15 s的每一个调试认证/输入证书引脚,所以我有一些假的auth state provider,假装用户是认证的,并有一些权限
现在在服务器端,所有控制器都允许匿名,但在生产时

app.MapControllers().RequireAuthorization();

来点刺激安全的把戏。
现在我有一些地方我需要这个OIDC/或假用户名

string login = User.Claims.Where(p => p.Type == "preferred_username").First().Value;

这在PROD萌芽时很好地工作,当开发和伪auth序列不包含元素时-因为我不传递任何令牌来请求当开发如此快速时;我...

因此,问题是如何在服务器端也伪造身份验证?因此,此userclaim在开发期间填充了一些伪造数据?

非常感谢和问候

ryevplcw

ryevplcw1#

一般来说,我建议您在开发环境中不要做与生产环境中不同的事情,因为那里的bug往往不被注意到,但是如果您找不到任何其他方法,我想您可以使用一些自己的实现来覆盖默认的主体工厂,如下所示:

public class PrincipalFactory : AccountClaimsPrincipalFactory<RemoteUserAccount>{

       public PrincipalFactory(IAccessTokenProviderAccessor accessor) : base(accessor)
       {
       }

       public override async ValueTask<ClaimsPrincipal> CreateUserAsync(RemoteUserAccount account, RemoteAuthenticationUserOptions options)
       {
           var principal = await base.CreateUserAsync(account, options);

           if (principal.Identity is ClaimsIdentity identity)
           {
               identity.AddClaim(new Claim("preferred_username", "dev_user"));
           } 

           return principal;
       }
    }

并将其添加到Program.cs中:

var authBuilder = builder.Services.AddOidcAuthentication(options => { });

if(builder.Environment.IsDevelopment()){
    authBuilder.AddAccountClaimsPrincipalFactory<PrincipalFactory>();
}

我没有测试过这个,但我想你明白我的意思。
编辑:我突然想到一个更好的方法可能是只在开发环境中添加这个工厂,所以我稍微修改了一下这个例子。

biswetbf

biswetbf2#

我做了它喜欢在这里和工程罚款-不确定如果最好的选择?请随时评论,如果有人有更好的想法

public class DebugAuthenticationHandler : 
AuthenticationHandler<AuthenticationSchemeOptions>
{
public DebugAuthenticationHandler(
  IOptionsMonitor<AuthenticationSchemeOptions> options,
  ILoggerFactory logger,
  UrlEncoder encoder,
  ISystemClock clock)
  : base(options, logger, encoder, clock) { }

protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
    var claims = new List<Claim> { new Claim(ClaimTypes.Name, "DebugAdmin") };
    claims.Add(new Claim(ClaimTypes.Role, "Admin"));
    claims.Add(new Claim("preferred_username", "DebugAdmin"))
    var identity = new ClaimsIdentity(claims, "Server authentication");
    var principal = new ClaimsPrincipal(identity);
    var ticket = new AuthenticationTicket(principal, Scheme.Name);
    return await Task.FromResult(AuthenticateResult.Success(ticket));
}
}

和启动:

if (builder.Environment.IsDevelopment())
 {
   builder.Services.AddAuthentication(
   options => options.AddScheme<DebugAuthenticationHandler>("debug", "debug"));
   builder.Services.AddAuthorization(options =>
{
    var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder("debug");
    defaultAuthorizationPolicyBuilder = defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
    options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
});

相关问题