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# 如果授权失败,是否可以忽略所有身份验证方案,只返回401错误码?_C#_Asp.net Core_.net Core - Fatal编程技术网

C# 如果授权失败,是否可以忽略所有身份验证方案,只返回401错误码?

C# 如果授权失败,是否可以忽略所有身份验证方案,只返回401错误码?,c#,asp.net-core,.net-core,C#,Asp.net Core,.net Core,我正在开发一个web api,它对我们的另一个应用程序使用一些授权来验证用户是否仍然登录,并可能继续执行他们请求的操作。但是,当用户未通过身份验证时,服务器会响应500内部服务器错误,堆栈跟踪可在下面找到。 我似乎无法使配置进入正确状态。从堆栈跟踪中,我可以看出它试图退回到一些默认的身份验证方案,我还没有定义,理想情况下也不感兴趣,因为我们总是希望针对第三方进行授权,如果它返回false,则会失败 Startup.cs public void配置服务(IServiceCollection服务)

我正在开发一个web api,它对我们的另一个应用程序使用一些授权来验证用户是否仍然登录,并可能继续执行他们请求的操作。但是,当用户未通过身份验证时,服务器会响应500内部服务器错误,堆栈跟踪可在下面找到。 我似乎无法使配置进入正确状态。从堆栈跟踪中,我可以看出它试图退回到一些默认的身份验证方案,我还没有定义,理想情况下也不感兴趣,因为我们总是希望针对第三方进行授权,如果它返回false,则会失败

Startup.cs

public void配置服务(IServiceCollection服务)
{
services.AddScoped(=>
新的AuthService(damInfo.BaseUrl、damInfo.SystemUsername、damInfo.SystemPassword));
services.addScope();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddAuthorization(选项=>
{
options.AddPolicy(“ServicePolicy”,policy=>
policy.Requirements.Add(新服务需求(“”));
/*options.DefaultPolicy=new AuthorizationPolicyBuilder().AddAuthenticationSchemes(Constants.NoOp).requireAuthenticationDuser().Build();//keep#1#*/
options.InvokeHandlersAfterFailure=false;
});
services.AddAuthentication(选项=>
{
options.DefaultScheme=Constants.NoOp;
options.DefaultChallengeScheme=Constants.NoOp;
});
}
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
if(env.IsDevelopment())
app.UseDeveloperExceptionPage();
其他的
app.UseHsts();
app.UseCors(builder=>
{
builder.AllowAnyHeader();
builder.AllowAnyMethod();
builder.AllowAnyOrigin();
});
app.UseHttpsRedirection();
app.UseMvc();
}
政策:

使用Microsoft.AspNetCore.Authorization;
命名空间Core.Services.Authentication
{
公共类服务要求:IAuthorizationRequirement
{
公共字符串CurrentToken{get;private set;}
公共服务要求(字符串令牌)
{
CurrentToken=token;
}       
}
}
授权属性:

[Authorize(Policy = "ServicePolicy")]
身份验证处理程序:

使用System.Net.Http.Headers;
使用System.Threading.Tasks;
使用Digizuite.Services.Authentication;
使用Microsoft.AspNetCore.Authorization;
使用Microsoft.Extensions.Primitives;
使用Microsoft.Net.Http.Header;
命名空间Core.Services.Authentication
{
公共类AuthenticationHandler:AuthorizationHandler
{
只读IAuthService\u authService;
/// 
///验证处理程序,用于检查用户是否已登录
/// 
/// 
公共身份验证处理程序(IAuthService authService)
{
_authService=authService;
}
/// 
///处理要求并检查isLoggedIn
/// 
/// 
/// 
/// 
受保护的重写异步任务HandleRequirementAsync(AuthorizationHandlerContext上下文,
服务要求)
{
var authFilterCtx=(Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext)context.Resource;
var httpContext=authFilterCtx.httpContext;
var headers=httpContext.Request.headers[HeaderNames.Authorization];
if(StringValues.IsNullOrEmpty(headers)==true)
{
context.Fail();
}
其他的
{
var auth=AuthenticationHeaderValue.Parse(头文件);
var loginResponse=_authService.IsLoggedInRequest(auth.Parameter).Result;
if(loginResponse.IsLoggedIn==false)
{
context.Fail();
}
其他的
{
成功(要求);
}
}
}
}
}
堆栈跟踪:

fail: Microsoft.AspNetCore.Server.Kestrel[13]
      Connection id "0HLOC48NR5MP4", Request id "0HLOC48NR5MP4:00000001": An unhandled exception was thrown by the application.
System.InvalidOperationException: No authenticationScheme was specified, and there was no DefaultChallengeScheme found.
   at Microsoft.AspNetCore.Authentication.AuthenticationService.ChallengeAsync(HttpContext context, String scheme, AuthenticationProperties properties)
   at Microsoft.AspNetCore.Mvc.ChallengeResult.ExecuteResultAsync(ActionContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultAsync(IActionResult result)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAlwaysRunResultFilters()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
   at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Digizuite.Logging2.LogClient.LoggerRequestMiddleware.InvokeAsync(HttpContext context, RequestDelegate next) in C:\dev\digizuite.core\Libs\LogClient\LoggerRequestMiddleware.cs:line 40
   at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.<>c__DisplayClass5_1.<<UseMiddlewareInterface>b__1>d.MoveNext()

fail:Microsoft.AspNetCore.Server.Kestrel[13]
连接id“0HLOC48NR5MP4”,请求id“0HLOC48NR5MP4:0000000 1”:应用程序引发了未处理的异常。
System.InvalidOperationException:未指定authenticationScheme,并且未找到DefaultChallengeScheme。
位于Microsoft.AspNetCore.Authentication.AuthenticationService.ChallengeAsync(HttpContext上下文、字符串方案、AuthenticationProperties)
位于Microsoft.AspNetCore.Mvc.ChallengeResult.ExecuteResultAsync(ActionContext上下文)
位于Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultAsync(IActionResult)
在Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAllwaysRunSultFilters()上
在Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()中
在Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()上
在Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext HttpContext)中
位于Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.Invoke(HttpContext上下文)
在Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext上下文)中
在C:\dev\Digizuite.core\Libs\LogClient\LoggerRequestMiddleware.cs:第40行中的Digizuite.Logging2.LogClient.LoggerRequestMiddleware.InvokeAsync(HttpContext上下文,RequestDelegate next)处
在Microsoft.AspNetCore.Builder.UseMidlewareExtensions.c_uuDisplayClass5_1.d.MoveNext()中
(这是我写的),听起来很相似,可能值得一看。