ASP.net Core WEP Api中动态选择的认证方案

Dynamically chose authentication scheme in ASP.net Core Wep Api(ASP.net Core WEP Api中动态选择的认证方案)
本文介绍了ASP.net Core WEP Api中动态选择的认证方案的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要将使用OWIN和.NET框架构建的自托管Web API移植到ASP.NET核心Web API(使用.NET 6.0)

在原始API中,我有一个定制的身份验证机制,它根据请求中的头部为每个调用动态选择身份验证方案:

HttpListener listener = (HttpListener)appBuilder.Properties["System.Net.HttpListener"];
listener.AuthenticationSchemeSelectorDelegate = new AuthenticationSchemeSelector((httpRequest) =>
{
    if(httpRequest.Headers.AllKeys.Any(k => k == "MyCustomHeader"))
    {
        return AuthenticationSchemes.Ntlm;
    }
    else
    {
        return AuthenticationSchemes.Anonymous;
    }
});

基本上,对于每个请求,我检查请求中的特定标头,并根据该标头选择是强制请求使用Windows身份验证还是允许请求匿名继续。

如何在ASP.net Core Web API中复制此行为?我通过使用Microsoft.AspNetCore.Authentication.NegotiateNuGet包并配置:

了解了如何使用Windows身份验证
services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
                .AddNegotiate();

但是,我不知道如何像以前那样动态选择是使用该方案还是允许基于标头的匿名呼叫。

这可能吗?我该怎么做?

推荐答案

以下是一种方法

services.AddAuthentication(opts =>
    {
        opts.DefaultScheme = "DynamicAuthenticationScheme";
    })
    .AddScheme<SystemSessionAuthenticationRelatedOptions, SystemAuthenticationRelatedHandler>(
        CommonConstants.SessionAuthentication, x => x.Test = "Ran in here")
    .AddCookie("CookieScheme")
    .AddJwtBearer(options =>
    {
        options.Authority = identityUrl;
        options.Audience = "shipping";
        options.RequireHttpsMetadata = false;
    })
    .AddPolicyScheme("DynamicAuthenticationScheme", "Default system policy",
        cfgOpts => cfgOpts.ForwardDefaultSelector = ctx =>
            ctx.Request.Headers.ContainsKey("IsTheSecretHeaderPresent?")
                ? "CookieScheme"
                : JwtBearerDefaults.AuthenticationScheme);

这个想法是为DynamicAuthenticationScheme指定一个默认身份验证方案,我们再为Cookie和JWT身份验证分别添加两个名为CookieSchemeJwtBearerDefaults.AuthenticationScheme常量的身份验证方案。

然后将我们的默认身份验证方案定义为基于标头信息的身份验证机制的路由。

这篇关于ASP.net Core WEP Api中动态选择的认证方案的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)