Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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# .Net核心中的Authorize/Roles属性_C#_.net Core - Fatal编程技术网

C# .Net核心中的Authorize/Roles属性

C# .Net核心中的Authorize/Roles属性,c#,.net-core,C#,.net Core,如果我在我的控制器方法上使用[Authorize(Roles=“xxx”)],它会执行它应该执行的操作,但返回403。有没有办法让它返回401?我发现有些是这样做的,但这是针对常规.Net的。您可以编写自定义中间件解决方案来处理此问题。然而,这里有一个例子,这可能是一个相当昂贵的服务器资源解决方案,具体取决于通常处理的响应类型(例如,文件是这种方法的一个问题)以及服务器的繁忙程度。也许可以通过降低成本来适应您的需求,但鉴于我从您的问题中获得的信息,我只能提供一种一般方法: 公共类替换HttpCo

如果我在我的控制器方法上使用[Authorize(Roles=“xxx”)],它会执行它应该执行的操作,但返回403。有没有办法让它返回401?我发现有些是这样做的,但这是针对常规.Net的。

您可以编写自定义中间件解决方案来处理此问题。然而,这里有一个例子,这可能是一个相当昂贵的服务器资源解决方案,具体取决于通常处理的响应类型(例如,文件是这种方法的一个问题)以及服务器的繁忙程度。也许可以通过降低成本来适应您的需求,但鉴于我从您的问题中获得的信息,我只能提供一种一般方法:

公共类替换HttpCode
{
私有请求代理nextDelegate;
专用(int codeToReplace,int replaceWithCode)HTTPCODE;
公共替换HttpCode(RequestDelegate nextDelegate、int-codeToReplace、int-replaceWithCode)
=>(this.nextDelegate,httpcode)=(nextDelegate,(codeToReplace,replaceWithCode));
公共异步任务调用(HttpContext上下文)
{
//保存指向实际客户端响应流的指针
var clientResponseStream=context.Response.Body;
//将客户端响应流重新指向MemoryStream
//警告:就服务器资源而言,这可能相当昂贵!
context.Response.Body=newmemoryStream();
//将上下文传递给行中的下一个中间件
wait nextDelegate.Invoke(上下文);
//…我们回来了!检查状态码
if(context.Response.StatusCode==httpCodes.codeToReplace)
{
//更新响应代码
context.Response.StatusCode=httpCodes.replaceWithCode;
}
其他的
{
//从MemoryStream复制响应
context.Response.Body.Seek(0,SeekOrigin.Begin);
等待context.Response.Body.CopyToAsync(clientResponseStream);
}
//重新指向原始客户端响应流
context.Response.Body=clientResponseStream;
}
}
用法: 您可以添加助手扩展(推荐方法):

公共静态类ReplaceHttpCodeExtensions
{
公共静态IAApplicationBuilder替换HttpCode(此IAApplicationBuilder,
int codeToReplace,
int replaceWithCode)
=>builder.useMidleware(codeToReplace,replaceWithCode);
}
并在
启动中的某处添加以下内容。配置(IApplicationBuilder应用程序,iWebHostenEnvironment env)
方法:

app.ReplaceHttpCode(403, 401);
确保将其插入中间件层次结构中的正确位置-如果您有其他中间件,您可能需要使用它来找出一个好的断点位置。在我的简单测试中,我将它放在函数顶部附近,就在异常处理配置之后


同样,我建议将此作为一个起点,看看您是否可以用这种中间件方法处理身份验证,以便减少或消除大量缓冲响应流。

您可以编写一个自定义中间件解决方案来处理此问题。然而,这里有一个例子,这可能是一个相当昂贵的服务器资源解决方案,具体取决于通常处理的响应类型(例如,文件是这种方法的一个问题)以及服务器的繁忙程度。也许可以通过降低成本来适应您的需求,但鉴于我从您的问题中获得的信息,我只能提供一种一般方法:

公共类替换HttpCode
{
私有请求代理nextDelegate;
专用(int codeToReplace,int replaceWithCode)HTTPCODE;
公共替换HttpCode(RequestDelegate nextDelegate、int-codeToReplace、int-replaceWithCode)
=>(this.nextDelegate,httpcode)=(nextDelegate,(codeToReplace,replaceWithCode));
公共异步任务调用(HttpContext上下文)
{
//保存指向实际客户端响应流的指针
var clientResponseStream=context.Response.Body;
//将客户端响应流重新指向MemoryStream
//警告:就服务器资源而言,这可能相当昂贵!
context.Response.Body=newmemoryStream();
//将上下文传递给行中的下一个中间件
wait nextDelegate.Invoke(上下文);
//…我们回来了!检查状态码
if(context.Response.StatusCode==httpCodes.codeToReplace)
{
//更新响应代码
context.Response.StatusCode=httpCodes.replaceWithCode;
}
其他的
{
//从MemoryStream复制响应
context.Response.Body.Seek(0,SeekOrigin.Begin);
等待context.Response.Body.CopyToAsync(clientResponseStream);
}
//重新指向原始客户端响应流
context.Response.Body=clientResponseStream;
}
}
用法: 您可以添加助手扩展(推荐方法):

公共静态类ReplaceHttpCodeExtensions
{
公共静态IAApplicationBuilder替换HttpCode(此IAApplicationBuilder,
int codeToReplace,
int replaceWithCode)
=>builder.useMidleware(codeToReplace,replaceWithCode);
}
并在
启动中的某处添加以下内容。配置(IApplicationBuilder应用程序,iWebHostenEnvironment env)
方法:

app.ReplaceHttpCode(403, 401);
确保将其插入中间件层次结构中的正确位置-如果您有其他中间件,您可能需要使用它来找出一个好的断点位置。在我的简单测试中,我把它放在函数顶部附近,就在异常处理配置之后