【问题标题】:Which HTTP Status to return when external authentication fails?外部身份验证失败时返回哪个 HTTP 状态?
【发布时间】:2016-05-02 19:01:24
【问题描述】:

在我的 ASP.NET MVC Web 应用程序中,我有一个外部单点登录,用于在企业中集中对用户进行身份验证。 SSO 应该返回一个唯一标识用户的“数据包”,然后将其用于传递给本地 ASP.NET Owin Cookie 身份验证(或表单身份验证,或类似的东西)。如果由于某种原因 SSO 提供的“数据包”不包含最低要求的信息,我想在本地 ASP.NET 级别适当地处理它。这是一个非常严重的错误,不一定会经常发生。所以我想我会做这样的事情:

public class AuthController() : Controller
{
    public ActionResult Login(string returnUrl)
    {
        // Process external single-sign-on authentication
        bool isSuccess = ProcessExternalAuth();
        if (!success)
            // return appropriate HTTP status code
        else
            // continue with login
    }
}

但我不确定要返回哪个 HTTP 状态代码。这样的事情合适吗?

return new HttpStatusCodeResult(
    HttpStatusCode.BadGateway, "SSO authentication failed.");

根据List of HTTP Status Codes,500 个错误之一可能是最合适的:

以数字“5”开头的响应状态代码表示服务器知道它遇到错误或无法执行请求的情况......

【问题讨论】:

  • 401 Unauthorized.....
  • 一开始我也是这么想的,但是这会导致重定向到“登录”页面,这是错误开始的地方,所以我们最终陷入了无限循环。跨度>
  • 500 适用于服务器因处理而出现服务器端问题时。 401 是您在未经身份验证的情况下尝试访问安全资源时得到的结果,因此在这种情况下可能是合适的,以避免您可以执行 400 的循环。
  • “数据包不包含最低要求信息”有什么原因?通过回答该问题,您可以确定正确的状态代码。
  • 此时数据包丢失最少信息的原因在技术上是未知的。用户可能已经通过 SSO 进行了身份验证,这并不关心我的应用程序需要的“最少信息”。一旦重定向回 NET 应用程序,它就会检查这个数据包,如果不满足我的应用程序的要求,它应该做出适当的响应。同样,SSO 应该包含所有这些信息,但由于它是一个外部资源,它超出了本地应用程序的控制范围,并且可能会出现问题。

标签: c# asp.net-mvc authentication http-status-codes


【解决方案1】:

错误代码 401 和错误代码 403 通常用于与身份验证相关的错误。然而,这些有一些标准与它们一起指定何时以及如何使用它们。在你的例子中,这些都不适合。例如,403 被描述为 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html):

403 禁止

服务器理解请求,但拒绝执行。授权将无济于事,并且不应重复请求。如果请求方法不是 HEAD 并且服务器希望公开请求未完成的原因,它应该在实体中描述拒绝的原因。如果服务器不希望向客户端提供此信息,则可以使用状态码 404(未找到)。

一个不错的选择是返回代码 503(服务不可用)。

503 服务不可用

由于服务器临时过载或维护,服务器当前无法处理请求。 这意味着这是一种暂时的情况,会在一段时间后得到缓解。

【讨论】:

  • 嗯,谢谢。仔细阅读这篇文章,实际上 403 开始​​听起来更有吸引力了。我的意思是,从技术上讲,就本地 ASP.NET 应用程序而言,由于 SSO 返回的信息不足,访问确实是“禁止的”。它不一定会解释为什么会发生这种情况,但这种反应是有道理的。不是吗?嗯……
  • 根据我在我的OP中链接的那篇文章,403的描述是:“请求是一个有效的请求,但服务器拒绝响应它。403错误在语义上意味着“未经授权” ,即用户没有资源的必要权限。”我认为这对我的情况来说是正确的。
  • @Jiveman 由于没有针对每种可能情况的状态代码,我通常只选择最能描述我的情况的一个。两者之间的主要区别(就我而言)是对于 403,不建议重试。对于 503,建议重试。 403 将是,“嘿,我不希望你访问该资源”,其中 503 表示“由于我的一些错误,我无法对你进行身份验证。稍后再试......也许它会被修复。”
【解决方案2】:

验证客户端的错误应低于 401:

401 未经授权 (RFC 7235)

类似于 403 Forbidden,但专门用于需要身份验证但失败或尚未提供的情况。响应必须包含一个 WWW-Authenticate 标头字段,该字段包含适用于所请求资源的质询。请参阅基本访问身份验证和摘要访问身份验证。 [36] 401 在语义上意味着“未经身份验证”,即用户没有必要的凭据。 注意:当某个 IP 地址被禁止访问网站(通常是网站域)并且该特定地址被拒绝访问网站时,某些网站会发出 HTTP 401。

https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_Error

【讨论】:

  • 一开始我也是这么想的,但是这会导致重定向到“登录”页面,这是错误开始的地方,所以我们最终陷入了无限循环。跨度>
猜你喜欢
  • 2022-08-16
  • 2021-09-27
  • 2022-12-21
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 2017-05-05
  • 2019-09-04
  • 1970-01-01
相关资源
最近更新 更多