当前位置: 首页 > 知识库问答 >
问题:

如何在ASP.NET Core 2.0中配置基于路由的预约身份验证

宋劲
2023-03-14

在ASP.NET Core 1.x中,我可以在Configure中使用身份验证方法,但现在在ASP.NET Core 2.0中,我必须在ConfigureSreservices中设置所有内容,而不能在ConfigureMethod中配置。例如:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication()
            .AddCookie()
            .AddXX();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ....
    app.UseAuthentication();
}
app.UseOpenIdConnectAuthentication();
app.Map(new PathString("/MyPath"), i => i.UseMyAuthMethod());

共有1个答案

齐晟
2023-03-14

在2.0中,执行每路由身份验证的最佳选项是使用自定义IAuthenticationSchemeProvider:

public class CustomAuthenticationSchemeProvider : AuthenticationSchemeProvider
{
    private readonly IHttpContextAccessor httpContextAccessor;

    public CustomAuthenticationSchemeProvider(
        IHttpContextAccessor httpContextAccessor,
        IOptions<AuthenticationOptions> options)
        : base(options)
    {
        this.httpContextAccessor = httpContextAccessor;
    }

    private async Task<AuthenticationScheme> GetRequestSchemeAsync()
    {
        var request = httpContextAccessor.HttpContext?.Request;
        if (request == null)
        {
            throw new ArgumentNullException("The HTTP request cannot be retrieved.");
        }

        // For API requests, use authentication tokens.
        if (request.Path.StartsWithSegments("/api"))
        {
            return await GetSchemeAsync(OAuthValidationDefaults.AuthenticationScheme);
        }

        // For the other requests, return null to let the base methods
        // decide what's the best scheme based on the default schemes
        // configured in the global authentication options.
        return null;
    }

    public override async Task<AuthenticationScheme> GetDefaultAuthenticateSchemeAsync() =>
        await GetRequestSchemeAsync() ??
        await base.GetDefaultAuthenticateSchemeAsync();

    public override async Task<AuthenticationScheme> GetDefaultChallengeSchemeAsync() =>
        await GetRequestSchemeAsync() ??
        await base.GetDefaultChallengeSchemeAsync();

    public override async Task<AuthenticationScheme> GetDefaultForbidSchemeAsync() =>
        await GetRequestSchemeAsync() ??
        await base.GetDefaultForbidSchemeAsync();

    public override async Task<AuthenticationScheme> GetDefaultSignInSchemeAsync() =>
        await GetRequestSchemeAsync() ??
        await base.GetDefaultSignInSchemeAsync();

    public override async Task<AuthenticationScheme> GetDefaultSignOutSchemeAsync() =>
        await GetRequestSchemeAsync() ??
        await base.GetDefaultSignOutSchemeAsync();
}

不要忘记在DI容器中注册它(理想情况下,作为一个单例):

// IHttpContextAccessor is not registered by default
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddSingleton<IAuthenticationSchemeProvider, CustomAuthenticationSchemeProvider>();
 类似资料:
  • 我的应用程序从Oracle Access Manager SSO获取一个带有用户名的AUTH_用户请求标头。Spring Security“附加主题”2.2。1有一个“PreAuth”的示例,这似乎是我需要的,但不是一个完整的工作示例。 下面的片段来自文档/示例,而不是基于注释的配置。 Siteminder示例配置-使用带有RequestHeaderAuthenticationFilter和Pre

  • 在斯威格中有一个.BasicAuth(“基本”)。我取消注释的描述(“基本HTTP授权”)行。 但是,当尝试使用其中一个endpoint时,单击“试用!”按钮时,系统会提示我登录。无论我在这个框中放了什么(用户名和密码框),我都无法运行或测试endpoint,因为我未经授权。我需要在 SwaggerConfig.cs 文件或其他位置执行哪些操作才能进行测试? 我使用的是.Net Framework

  • 我试图实现身份验证的路由,但发现React路由器4现在阻止此工作: 错误是: 警告:您不应使用

  • 我想使用Spring Cloud实现OAuth2的令牌刷新。 我可以使用以下有效负载通过向发送请求来创建令牌: 但对于刷新令牌,则使用相同的路径。我还需要将用户名和密码发送到标题中,但我没有它们。我可以使用以下负载使用刷新令牌创建一个新令牌: Github代码

  • 我一直在努力遵循这个教程: https://www.baeldung.com/spring-security-basic-authentication 我创建了几个restendpoint,如下所示: 现在的问题是,每当我试图发送POST请求时,我都会得到以下错误消息: HTTP状态401-访问此资源需要完全身份验证 我尝试了两种方法来发送请求,一种是通过邮递员 1.1 401 set-cooki

  • 最近我开始使用Laravel5.3来写博客,但是在运行