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);
}