【问题标题】:.Net Core 2.2 Generated AzureAD Authentication - InvalidOperationException: No authenticationScheme and no DefaultChallengeScheme?.Net Core 2.2 生成的 AzureAD 身份验证 - InvalidOperationException:没有 authenticationScheme 和 DefaultChallengeScheme?
【发布时间】:2019-02-27 23:54:23
【问题描述】:

我知道关于这个一般性主题有很多问题和答案,但在 .Net Core 2.2 中,所需/生成的代码是不同的。

如果您在 VisualStudio 中使用域身份验证创建一个新的 .Net Core 2.2 项目,使用 AzureAD,您将生成一个非常轻量级的项目,该项目可以正确进行身份验证。在 Startup.cs 中,您将找到下面启用此域 AzureAD 身份验证的代码,然后您相应地使用 [Authorize] 属性。问题是如果您尝试在另一个 .Net Core 2.2 项目中使用它。

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
                .AddAzureAD(options => Configuration.Bind("AzureAd", options));

            services.AddMvc(options =>
            {
                var policy = new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .Build();
                options.Filters.Add(new AuthorizeFilter(policy));
            })
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

我已将其与正确的设置一起复制到我已经创建的 .Net Core 2.2 项目中。它不是一个轻量级的项目,但不是广泛且非常简单。我得到了上面的错误,InvalidOperationException: No authenticationScheme was specified, and there was no DefaultChallengeScheme found

所以我想了解这怎么可能? Visual Studio 生成的 .Net Core 2.2 项目如何仅使用此代码,而另一个项目则不能?

【问题讨论】:

    标签: authentication .net-core azure-active-directory


    【解决方案1】:

    您可以尝试添加以下内容:

    services.AddAuthentication(options =>
                {
                    options.DefaultAuthenticateScheme = AzureADDefaults.AuthenticationScheme;
                    options.DefaultChallengeScheme = AzureADDefaults.AuthenticationScheme;
                }).AddAzureAD 
    

    等等……

    您可以在 Authorize 属性中选择方案:

    [Authorize(AuthenticationSchemes = AzureADDefaults.AuthenticationScheme)]
    

    【讨论】:

    • 我会试试这个。当我这样做时,我得到一个例外,说必须提供CallBackPath 选项。你知道这可能指的是哪里吗?
    • 另外,如果我使用上述方法,我是否总是必须在 [Authorize(AuthenticationSchemes = AzureADDefaults.AuthenticationScheme)] 属性上选择身份验证方案,还是纯 [Authorize] 可以工作?
    • 它是您在 AddAzureAd(options => options.CallbackPath; 中的选项的一部分;我认为您还必须告诉中间件使用身份验证,例如:app.UseAuthentication(); 请尝试一下,但是我认为您必须提供自定义身份验证方案。
    • 好吧,我会乱来的。但仍然困扰我的是,如果您使用 Visual Studio 创建一个全新的 Dotnet Core 2.2 应用程序,它在ConfigureServices 下的唯一代码就在上面。所以我试图理解这怎么可能。这似乎不正确,但它有效。它仅适用于该项目,不适用于其他地方。
    猜你喜欢
    • 1970-01-01
    • 2021-10-18
    • 2020-05-15
    • 2019-08-02
    • 2021-10-11
    • 2018-04-29
    • 1970-01-01
    • 2021-05-24
    • 2019-03-22
    相关资源
    最近更新 更多