未指定authenticationScheme,并且没有使用默认身份验证和自定义授权找到DefaultChallengeScheme

2024-05-11

我有一个 .NET Core 2.0 应用程序,并且遇到授权问题。我想针对特殊请求使用自定义授权。标头和标准默认身份验证。 首先,我在中添加配置Startup.cs:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    // ...
    services.AddAuthorization(options =>
    {
        options.AddPolicy(DefaultAuthorizedPolicy, policy =>
        {
            policy.Requirements.Add(new TokenAuthRequirement());
        });
    });
    services.AddSingleton<IAuthorizationHandler, AuthTokenPolicy>();
    // ...
}

AuthTokenPolicy.cs:

public class AuthTokenPolicy : AuthorizationHandler<TokenAuthRequirement>
{   
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, TokenAuthRequirement requirement)
    {
        var filterContext = context.Resource as AuthorizationFilterContext;
        var response = filterContext.HttpContext.Response;
        try
        {
            // some validation code

            var isValidToken = isValidTokenTask.Result;
            if (!isValidToken)
            {
                response.StatusCode = 401;
                return Task.CompletedTask;
            }

            response.StatusCode = 200;
            context.Succeed(requirement);
        }
        catch (Exception)
        {
            return Task.CompletedTask;
        }
        return Task.CompletedTask;
    }
}

and in HomeController.cs:

[Authorize(Policy = Startup.DefaultAuthorizedPolicy)]
public async Task<IActionResult> IsVisible()

如果我使用了错误的 request.headerAuthTokenPolicy我看到了,但在日志中我看到了这个错误:

System.InvalidOperationException: 未指定authenticationScheme,并且未找到DefaultChallengeScheme。\r\n 位于 Microsoft.AspNetCore.Authentication.AuthenticationService.d__11.MoveNext()\r\n--- 异常位置的堆栈跟踪结束被抛出 ---\r\n 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 Microsoft.AspNetCore.Mvc。 ChallengeResult.d__14.MoveNext()\r\n--- 从先前引发异常的位置开始的堆栈跟踪结束 ---\r\n 位于 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n 位于系统.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 位于 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__19.MoveNext()\r\n--- 抛出异常的上一个位置的堆栈跟踪结束---\r\n 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 Microsoft.AspNetCore.Mvc.Internal。 ResourceInvoker.d__17.MoveNext()\r\n--- 从先前引发异常的位置开始的堆栈跟踪结束 ---\r\n 位于 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n 位于系统.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 位于 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__15.MoveNext()\r\n--- 抛出异常的上一个位置的堆栈跟踪结束---\r\n 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 Microsoft.AspNetCore.Builder.RouterMiddleware。 d__4.MoveNext()\r\n--- 从先前引发异常的位置开始的堆栈跟踪结束 ---\r\n 位于 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n 位于 System.Runtime .CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 位于 Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.d__3.MoveNext()\r\n--- 堆栈跟踪结束,从引发异常的上一个位置开始 ---\ r\n 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 React.AspNet.BabelFileMiddleware.d__5.MoveNext()\ r\n--- 从先前抛出异常的位置开始的堆栈跟踪结束 ---\r\n 位于 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n 位于 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (任务任务)\r\n 位于 Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.d__6.MoveNext()\r\n--- 堆栈跟踪结束处,从先前引发异常的位置开始 ---\r\n 位于 System. Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n 位于 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 位于 D:\Dev 中的 core.common.Middleware.LoggingMiddleware.d__3.MoveNext() \microservicePDP\Template\core.common\Middleware\LoggingMiddleware.cs:第 72 行

看完之后将身份验证和身份迁移到 ASP.NET Core 2.0 https://learn.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x我已在startup.cs中添加此代码

文章引用:

services.AddAuthentication(options => 
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
});

如果满足以下条件之一,则在 2.0 中定义默认方案: 您希望用户自动登录 您使用[Authorize]属性或授权策略而不指定方案

I added AuthenticationScheme and DefaultChallengeScheme in ConfigureServices()。这没有帮助,这里同样的错误。我尝试过使用app.UseAuthentication(); in the Startup.Configure()方法,没有结果。

如何在不进行身份验证的情况下使用自定义授权?


不要使用授权来代替身份验证。我应该获得通过标头为所有客户提供服务的完整访问权限。

工作代码是:

public class TokenAuthenticationHandler : AuthenticationHandler<TokenAuthenticationOptions> 
{
    public IServiceProvider ServiceProvider { get; set; }

    public TokenAuthenticationHandler (IOptionsMonitor<TokenAuthenticationOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock, IServiceProvider serviceProvider) 
        : base (options, logger, encoder, clock) 
    {
        ServiceProvider = serviceProvider;
    }

    protected override Task<AuthenticateResult> HandleAuthenticateAsync () 
    {
        var headers = Request.Headers;
        var token = "X-Auth-Token".GetHeaderOrCookieValue (Request);

        if (string.IsNullOrEmpty (token)) {
            return Task.FromResult (AuthenticateResult.Fail ("Token is null"));
        }           

        bool isValidToken = false; // check token here

        if (!isValidToken) {
            return Task.FromResult (AuthenticateResult.Fail ($"Balancer not authorize token : for token={token}"));
        }

        var claims = new [] { new Claim ("token", token) };
        var identity = new ClaimsIdentity (claims, nameof (TokenAuthenticationHandler));
        var ticket = new AuthenticationTicket (new ClaimsPrincipal (identity), this.Scheme.Name);
        return Task.FromResult (AuthenticateResult.Success (ticket));
    }
}

启动.cs:

#region Authentication
services.AddAuthentication (o => {
    o.DefaultScheme = SchemesNamesConst.TokenAuthenticationDefaultScheme;
})
.AddScheme<TokenAuthenticationOptions, TokenAuthenticationHandler> (SchemesNamesConst.TokenAuthenticationDefaultScheme, o => { });
#endregion

和 mycontroller.cs:

[Authorize(AuthenticationSchemes = SchemesNamesConst.TokenAuthenticationDefaultScheme)]
public class MainController : BaseController
{ ... }

我现在找不到 TokenAuthenticationOptions,但它是空的。我找到了相同的类 PhoneNumberAuthenticationOptions:

public class PhoneNumberAuthenticationOptions : AuthenticationSchemeOptions
{
    public Regex PhoneMask { get; set; }// = new Regex("7\\d{10}");
}

你应该定义静态类SchemesNamesConst。就像是:

public static class SchemesNamesConst
{
    public const string TokenAuthenticationDefaultScheme = "TokenAuthenticationScheme";
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未指定authenticationScheme,并且没有使用默认身份验证和自定义授权找到DefaultChallengeScheme 的相关文章

随机推荐

  • 如何在正则表达式之后打印单词但不打印相似的单词?

    我想要一个 awk 或 sed 命令来打印正则表达式之后的单词 我想找到一个单词后面的单词 但不是看起来相似的单词 该文件如下所示 somethingsomething X Windows Icon xournal somethingsom
  • “npm”不被识别为内部或外部命令、可操作程序或批处理文件

    我对 Nodejs 完全陌生 我正在尝试让 nodejs 在我的 Windows 2008 机器上工作 以便安装 Karma 我将使用它来 TDDing 我的 AngularJs 代码 到目前为止我已经完成了以下步骤 使用 Chocolat
  • 是否有用于 AES 的纯 Perl 模块?

    是否有用于 AES 的纯 Perl 模块 地穴 Rijndael PP http search cpan org dist Crypt Rijndael PP Rijndael 是底层算法AES https secure wikimedia
  • 如何在 Scala 中编写 Pig UDF

    我正在尝试在 Scala 中编写 Pig UDF 使用 Eclipse 我已将 pig jar 添加为 java 构建路径中的库 这似乎解决了以下 2 个导入问题 导入 org apache pig EvalFunc 导入 org apac
  • Docker:通过 CLI 使用 --password 是不安全的。使用--密码-stdin

    当我在持续集成 CI 过程中登录注册表时 出现以下警告 WARNING Using password via the CLI is insecure Use password stdin 我应该更换吗 password with passw
  • 在布局中添加空格

    我正在尝试在 android 中创建空行 这就是我一直在做的事情 android layout width fill parent android layout height wrap content android text n n 我想
  • 从 exe 文件中获取汇编级代码?

    我当时正在做linux汇编编程 在过去的几天里我已经转而学习windows汇编编程 我在用ml作为我的汇编器和golink作为我的链接器 我有我的汇编代码并已获得我的exe从中 现在我需要取回它的十六进制 xff xab x55等等 在li
  • 删除 Swift 3 中 Core Data 实体中的所有数据

    有没有办法批量删除核心数据中所有实体中存储的所有数据 我在某处读到 在 iOS 9 或 10 中 苹果引入了一种批量删除的方法 但我似乎找不到任何关于它的好信息 最终 我只需要一个遍历实体并删除其中所有数据的函数 看起来它应该很简单 但事实
  • 如何在 Debian 上编译 DOS 程序?

    在我的汇编语言课程中 我们使用 DPMI 编写 DOS 程序 不幸的是 我无法一直使用 32 位 Windows 机器 我在我使用的几乎每台计算机上都安装了 Debian 虚拟机 我已经安装了 DOSBox 和 DOSEMU 有什么办法可以
  • 如何使用python正则表达式查找并替换句子中第n次出现的单词?

    仅使用python正则表达式 如何查找并替换句子中第n次出现的单词 例如 str cat goose mouse horse pig cat cow new str re sub r cat r Bull str new str re su
  • 为什么 cross_val_predict 比 KNeighborsClassifier 的拟合慢得多?

    在 Jupyter 笔记本上本地运行并使用 MNIST 数据集 28k 条目 每个图像 28x28 像素 以下内容为27秒 from sklearn neighbors import KNeighborsClassifier knn clf
  • 如何保护我的网站免遭 HTTrack 或其他软件的翻录?

    我最近获得了批准的网站模板主题森林 http themeforest net 我的网站流量过多 并注意到我在 Themeforest 上的演示被 HTTrack 等某些软件破坏 如果这种情况持续下去 该产品的销量最终可能会下降 那么 有什么
  • “mov (%ebx,%eax,4),%eax”如何工作? [复制]

    这个问题在这里已经有答案了 一直在从事装配作业 并且在很大程度上我对装配非常了解 或者至少对于这项任务来说足够好 但这个 mov 的声明让我很困惑 如果有人能解释这个 mov 语句如何操作寄存器值 我将非常感激 mov ebx eax 4
  • 我们在Asp.net 5 Core中使用哪种加密算法

    目前 当我将项目类型从 Asp net 5 0 切换到 Asp net 5 0 Core 时 几乎所有加密算法都开始出现错误 这是因为它们都需要 System Security Cryptography 命名空间 而这在 Core 5 0
  • 强制jvm返回本机内存[重复]

    这个问题在这里已经有答案了 我时不时地运行需要大量内存的 eclipse 任务 因此 当任务运行时 jvm 会消耗大约 2 3GB 的 RAM 这是可以的 但是一旦 jvm 占用了该内存 它就不会释放它 并且我遇到了一种情况 堆中已用内存约
  • 为什么 ops::Range 不实现 Copy,即使 T 是 Copy?

    最近 我想编写一个保存 3D 投影参数的类型 use std ops Range derive Clone Copy struct CamProj Near and far plane proj range Range
  • 矩阵方括号

    我正在使用 Java Swing 我需要显示一个带有方括号的矩阵 普通方括号就像我们在数学中使用的跨多行的方括号 矩阵大小不固定 它取决于输入 这是我用来显示矩阵的代码 public static void printMatrix Stri
  • 如何使用与号 (&) 替换匹配模式中的字符

    当我们使用 sed 匹配模式时 匹配的模式存储在 变量中 有没有办法使用 符号本身替换此匹配模式中的字符 例如 如果 包含字符串 apple1 我如何使用 将字符串转换为 apple2 即将 1 替换为 2 如果我猜对了 您要做的就是在匹配
  • 从项目文件加载图像

    我正在尝试获取 png 图像 这是我的资源文件夹 我测试了这里写的解决方案 将图像添加到列表框 c Windows Phone 7 https stackoverflow com questions 9348766 add images t
  • 未指定authenticationScheme,并且没有使用默认身份验证和自定义授权找到DefaultChallengeScheme

    我有一个 NET Core 2 0 应用程序 并且遇到授权问题 我想针对特殊请求使用自定义授权 标头和标准默认身份验证 首先 我在中添加配置Startup cs public IServiceProvider ConfigureServic