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
Asp.net core 如何使用ChallengeAsync重定向到asp.net core中间件中的登录页面_Asp.net Core_Swagger_Middleware - Fatal编程技术网

Asp.net core 如何使用ChallengeAsync重定向到asp.net core中间件中的登录页面

Asp.net core 如何使用ChallengeAsync重定向到asp.net core中间件中的登录页面,asp.net-core,swagger,middleware,Asp.net Core,Swagger,Middleware,我试图使用自定义中间件限制对路径/swagger的访问。我几乎完成了,但有一个问题是我无法将其重定向到登录页面路径https://localhost:44386/Identity/Account/Login相反,它会重定向到https://localhost:44386/swagger/Identity/Account/Login?ReturnUrl=https%3A%2F%2Flocalhost%3A44386%2FIdentity%2FAccount%2FLogin哪些原因导致localho

我试图使用自定义中间件限制对路径
/swagger
的访问。我几乎完成了,但有一个问题是我无法将其重定向到登录页面路径
https://localhost:44386/Identity/Account/Login
相反,它会重定向到
https://localhost:44386/swagger/Identity/Account/Login?ReturnUrl=https%3A%2F%2Flocalhost%3A44386%2FIdentity%2FAccount%2FLogin
哪些原因导致
localhost重定向您的次数太多。

这是
Startup.cs

公共类启动
{
公共启动(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
//此方法由运行时调用。请使用此方法将服务添加到容器中。
public void配置服务(IServiceCollection服务)
{
services.AddDbContext(选项=>
options.UseSqlServer(
GetConnectionString(“MyDbContextConnection”);
services.AddDefaultIdentity(options=>options.SignIn.RequireConfirmedAccount=true)
.AddRoles()
.AddEntityFrameworkStores();
services.AddAuthorization(选项=>
{
options.AddPolicy(“Admin”,policy=>policy.requirecall(“SwaggerPermission”,“CanExecute”);
});
//设置删除页
services.AddRazorPages()
.AddRazorPagesOptions(选项=>
{
options.Conventions.AuthorizeAreaFolder(“Identity”、“/Home”);
options.Conventions.AddAreaPageRoute(“Identity”、“/Account/Login”、”);
});
//招摇过市
services.AddSwaggerGen(c=>
{
c、 SwaggerDoc(“v1”,新OpenApiInfo{Title=“SolarPeple API”,Version=“v1”});
c、 AddSecurityDefinition(“载体”),新的OpenApiSecurityScheme
{
Description=“使用承载方案的JWT授权标头。\r\n\r\n输入'Bearer'[space],然后在下面的文本输入中输入您的令牌。\r\n\r\n例如:'Bearer 12345abcdef',
Name=“授权”,
In=参数位置.Header,
类型=SecuritySchemeType.ApiKey,
Scheme=“持票人”
});
var oasr=new OpenApiSecurityRequirement();
oasr.Add(新的OpenApiSecurityScheme
{
Reference=新的OpenApiReference
{
Type=ReferenceType.SecurityScheme,
Id=“持票人”
},
Scheme=“oauth2”,
Name=“持票人”,
In=参数位置.Header,
},新列表());
c、 新增安全要求(oasr);
});
}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境、iLogger工厂)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
//在开发人员上启用种子设定
初始化(应用程序服务);
}
//初始化log4net
loggerFactory.AddLog4Net();
//点击招摇过市页面时进行身份验证
app.Map(“/swagger”,分支=>
{
分支机构。使用斯威格授权(“管理”);
});
//大摇大摆
app.UseSwagger();
app.UseSwaggerUI(选项=>
{
options.SwaggerEndpoint(“/swagger/v1/swagger.json”,“我的API”);
});
//允许http重定向
app.UseHttpsRedirection();
//允许访问wwwroot静态文件
app.UseStaticFiles();
//允许路由
app.UseRouting();
//启用页面的身份验证
app.UseAuthentication();
//启用基于角色的身份验证
app.UseAuthorization();
app.UseEndpoints(端点=>
{
//自动映射剃须刀页面
endpoints.MapControllers();
endpoints.MapRazorPages();
});
}
}
以及中产阶级

公共静态类SwaggerAuthorizationExtensions
{
公共静态IAApplicationBuilder UseSwaggerAuthorization(此IAApplicationBuilder,字符串policyName)
{
返回builder.useMediddleware(policyName);
}
}
公共类虚张声势授权
{
private readonly RequestDelegate\u next;
私有只读字符串_policyName;
公共授权(RequestDelegate下一步,字符串policyName)
{
_下一个=下一个;
_policyName=policyName;
}
公共异步任务InvokeAsync(HttpContext上下文,IAAuthorizationService authorizationService)
{
var authorizeResult=await authorizationService.AuthorizeAsync(context.User,null,_policyName);
如果(!authorizeResult.successed)
{
var redirectUrl=UriHelper.BuildAbsolute(context.Request.Scheme,context.Request.Host,“/Identity/Account/Login”);
wait context.ChallengeAsync(新的AuthenticationProperties
{
重定向URI=重定向URL
});
返回;
}
等待下一步(上下文);
}
}

由于您使用的是ASP.NET核心标识,因此默认的身份验证方案是
await context.ChallengeAsync(new AuthenticationProperties
{
    RedirectUri = context.Request.Path,
});