Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在core2.2 mvc项目中使用ICLAIMS转换_C#_Asp.net Core_.net Core_Asp.net Core Mvc_Asp.net Core 2.2 - Fatal编程技术网

C# 如何在core2.2 mvc项目中使用ICLAIMS转换

C# 如何在core2.2 mvc项目中使用ICLAIMS转换,c#,asp.net-core,.net-core,asp.net-core-mvc,asp.net-core-2.2,C#,Asp.net Core,.net Core,Asp.net Core Mvc,Asp.net Core 2.2,我正在尝试学习如何使用IClaimsTransformation修改windows身份验证中的用户声明。但是当我尝试使用它时,我得到一个错误 InvalidOperationException:未指定authenticationScheme,也未找到DefaultChallengeScheme 我主要是在mac电脑上试用,但我也在我公司的pc上试用过。他们两个都给了我同样的错误。我也是IIS express(VS和Rider的调试模式) 在我的启动文件中 public void Configur

我正在尝试学习如何使用
IClaimsTransformation
修改windows身份验证中的用户声明。但是当我尝试使用它时,我得到一个错误

InvalidOperationException:未指定authenticationScheme,也未找到DefaultChallengeScheme

我主要是在mac电脑上试用,但我也在我公司的pc上试用过。他们两个都给了我同样的错误。我也是IIS express(VS和Rider的调试模式)

在我的启动文件中

public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddAuthentication(IISDefaults.AuthenticationScheme);
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

        services.AddSingleton<IClaimsTransformation, UserClaims>();

    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseAuthentication();
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });



    }
InvalidOperationException:未指定authenticationScheme,也未找到DefaultChallengeScheme

几个月前我使用Windows身份验证时遇到了同样的问题。原来我没有启用Windows身份验证

请检查“属性/调试”选项卡,并确保选中了“启用Windows身份验证”:


作为旁注,您正在修改原始的
主体
。在国际海事组织,最好返回全新的负责人:

public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal) { var cp = principal.Clone(); // create a copy var ci = (ClaimsIdentity)cp.Identity; var c = new Claim(ci.RoleClaimType, "Admin"); ci.AddClaim(c); // modify the copy return Task.FromResult(cp); } 公共任务TransformAsync(ClaimsPrincipal主体) { var cp=principal.Clone();//创建一个副本 var ci=(索赔实体)cp.Identity; var c=新索赔(ci.RoleClaimType,“管理”); ci.AddClaim(c);//修改副本 返回任务.FromResult(cp); }
首先,将Rider用作IDE弄乱了我的调试设置,在删除演示应用程序并将调试设置恢复为默认IIS Express设置后,我设法使代码正常工作


在那之后,我每次尝试调试我的应用程序时都会出现403错误,在@itminus的帮助下,我们在我的中间件订单中发现了这个问题。我在UseAuthentication()上使用UseAuthentication(),这是我的错误。因此,将UseAuthentication()置于UseAuthentication()之上解决了我的第二个问题。

Windows身份验证已启用,但我的iisexpress设置存在问题。当我重置它们时,它开始工作。但这次我无法调试ClaimTransformation类,它不会在断点处停止。对于返回的原始委托人,您是对的,最好返回新的委托人,但这是测试建议的演示代码,因此我没有过多考虑:)@MustafaYılmaz“但我的iisexpress设置有问题”:如果是这样,最好将其作为答案发布。实际上,这是答案的一半。我仍然无法使用我的ICLAIMS转换。我的问题是如果我使用[Authorize(Roles=“Admin”)]它不会运行我的ClaimTransformation类,但是如果我使用[Authorize],我的转换会成功运行。@MustafaYılmaz 1。我昨天测试了你的代码。这对我来说效果很好,只是因为特权问题,我不得不克隆委托人。2.由于您已经更改了IIS设置,因此最好向我们显示更改了哪些设置,如果您能告诉我们有关错误信息/行为的更多信息,那就太好了。还有一种重现此问题的方法是首选的。@MustafaYılmaz这是因为您使用的是ASP.NET 3.0(而不是OP中描述的2.2),ASP.NET Core 3.0使用了
UseAuthorization()
中间件,而您在
UseAuthentication()
之前调用该中间件太早了。
[Authorize(Roles = "Admin")]
public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal) { var cp = principal.Clone(); // create a copy var ci = (ClaimsIdentity)cp.Identity; var c = new Claim(ci.RoleClaimType, "Admin"); ci.AddClaim(c); // modify the copy return Task.FromResult(cp); }