gpt4 book ai didi

asp.net-mvc - .NET核心2 : Force authentication handler to run before middleware?

转载 作者:行者123 更新时间:2023-12-02 03:24:19 24 4
gpt4 key购买 nike

将 .NET Core 1 Web 项目中的 api 端点剥离到仅 .NET Core 2 api 项目。我对身份验证(-orization 和 -entication)的经验充其量是最少的,主要是因为我参与的大多数项目已经设置了身份验证和/或它是 AD 环境。

网站的 API 部分使用预共享 token 包含在每个请求的 header 中。该 token 是所有身份验证、用户识别、权限等的关键。用户信息(即您是谁以及您可以做什么)包含在自定义 CurrentContext 类中。

Core 1 项目使用中间件 (ContextMiddleware) 来初始化在 DI 中注册为范围CurrentContext 实例。当调用 ContextMiddleware 类时,自定义身份验证处理程序已被调用,必要的 header token 已被检查,身份验证检查已通过,并且主体已创建。因此,很大程度上依赖于现有主体的 ContextMiddleware 类可以构建 CurrentContext 以及了解谁在调用所需的大量信息。

Core 2 项目最终在身份验证处理程序之前运行 ContextMiddleware,但我不知道如何强制这两个项目交换顺序。

相关代码片段:

public class Startup {
public void ConfigureServices(IServiceCollection services) {
// ...
// https://geeklearning.io/how-to-migrate-your-authentication-middleware-to-asp-net-core-2-0/
services.AddAuthentication( options =>
{
options.DefaultScheme = UserTokenAuthenticationDefaults.AuthenticationScheme;
} ).AddUserTokenAuthentication(UserTokenAuthenticationDefaults.AuthenticationScheme,
UserTokenAuthenticationDefaults.AuthenticationScheme,
o => { } );

// ...
}

public void Configure(IApplicationBuilder app /*...*/) {
if (env.IsDevelopment()){
app.UseDeveloperExceptionPage();
} else {
app.UseExceptionHandler("/error/500");
}

app.UseStaticFiles();

app.UseAuthentication();

app.UseMiddleware<ContextMiddleware>();

app.UseMvc();
}
}

如果需要更多代码片段来获取更多信息,请告诉我。如何强制我的身份验证处理程序的 HandleAuthenticateAsync() 在调用 ContextMiddleware 之前运行?

最佳答案

我也正在处理这个问题,我们发现最好支持我们制定的“动态”身份验证方案,然后允许调用选择器来做出身份验证类型决策。

根据 ASP.NET Core 标准在代码库中的某个位置添加一个 DynamicAuthenticationDefaults.AuthenticationScheme = "Dynamic"; 常量,然后在启动类的 ConfigureServices 中添加动态方案:

.AddAuthentication( options =>
{
options.DefaultScheme = DynamicAuthenticationDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = DynamicAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = DynamicAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = DynamicAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignOutScheme = DynamicAuthenticationDefaults.AuthenticationScheme;
} )
.AddYourCustomAuthentication( YourCustomAuthenticationDefaults.AuthenticationScheme, YourCustomAuthenticationDefaults.AuthenticationScheme, options => { } )
.AddPolicyScheme( DynamicAuthenticationDefaults.AuthenticationScheme, DynamicAuthenticationDefaults.AuthenticationScheme, options =>
{
options.ForwardDefaultSelector = DynamicAuthenticationSchemaSelector.Evaluate;
} );

然后在自定义 DynamicAuthenticationSchemaSelector 类中实现该评估方法:

public static class DynamicAuthenticationSchemaSelector
{
public static string Evaluate( HttpContext context )
{
string result;

var authHeader = context.Request.Headers["Authorization"].FirstOrDefault();

if( !string.IsNullOrEmpty( authHeader ) && authHeader.StartsWith( YourCustomAuthenticationDefaults.AuthenticationScheme ) )
{
result = YourCustomAuthenticationDefaults.AuthenticationScheme;
}
else
{
result = IdentityConstants.ApplicationScheme;
}

return result;
}
}

您将获得正确的身份验证中间件处理。

您也不需要将其称为“动态”,它只是为了遵循最佳实践/模式 - 任何字符串就足够了。

关于asp.net-mvc - .NET核心2 : Force authentication handler to run before middleware?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52681294/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com