如何向RestSharp客户端返回401身份验证错误?

5
在我的Mvc Api控制器中,如果用户无法通过身份验证,我会抛出一个HttpException 401异常。但是,RestSharp客户端似乎将其转换为Http 500状态码。
我想要能够从我的Mvc控制器中抛出HttpExceptions,并使RestSharp客户端保留其StatusCode属性中的原始错误。
此外,我注意到如果服务器没有启动,当RestSharp客户端发出请求时,响应的状态代码为0,响应代码为Error。RestSharp不应该返回404 http错误代码吗?
我真正需要的是一些关于RestSharp如何使用HttpCodes的文档。
在我的api控制器中更新了代码:
throw new HttpException((int)HttpStatusCode.Unauthorized, AuthenticationError);
4个回答

12

您是否已确认确实向客户端返回了401?ASP.NET MVC有时会出现一些奇怪的错误处理。

尝试返回HttpUnauthorizedResultMSDN文档


我已经更新了我的帖子,并附上了代码示例。控制器提供json服务,因此使用HttpUnauthorisedResult是否能够正确工作?我在这里做的是正确的吗? - jaffa
我的答案仍然适用。我认为 ASP.NET MVC 处理你的 HttpException 不正确(并返回 501),而不是 RestSharp 将 401 转换为 500。 - jgauffin
1
这似乎会破坏httpcodes。我将无法向用户显示正确的错误。在这种情况下,Mvc应该向客户端(RestSharp)发送正确的401。有没有什么解决方法? - jaffa
在您的授权过滤器(或控制器操作)中使用HttpUnauthorizedResult动作结果。它是包含在ASP.NET MVC中的一个动作结果。 - jgauffin
仍然没有解决这个问题,有人能否尝试在ASP.Net MVC和RestSharp中重现这个问题。我正在引发HTTP错误,但它们在某个地方丢失了。 - jaffa

4

以下是MVC中返回401的两种方法:

return new HttpUnauthorizedResult("Unauthorized");

或者

return new HttpStatusCodeResult(401);

4
我已经能够自己调查这个问题。Web应用程序设置了表单身份验证,这意味着当控制器返回HttpUnauthorizedResult时,MVC会跳转到登录页面。这会使客户端认为没有发生任何错误。
我通过使用aspnet.suppressformsredirect nuget包,并将禁止标志添加到身份验证响应中来解决了这个问题。

2
没错 @jaffa,这应该是MVC 4的被接受答案。但是我们不得不下载一些东西才能返回401,这有多糟糕啊?荒谬。我同样糟糕的解决方法是发送403 Forbidden。(请参见我的答案)。 - Rap

2

我们不得不下载一个NuGet包才能返回401状态码,这真的很烦人!我的解决方法是返回403 Forbidden状态码并附上解释:

throw new HttpException((int)HttpStatusCode.Forbidden, 
  "Please log in as user " + UserId + " and try again.");

虽然不符合语义要求,但更省事、维护成本更低,并且风险更小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接