当外部认证失败时返回哪个HTTP状态码?

4
在我的ASP.NET MVC Web应用程序中,我有一个外部的单点登录系统,用于在企业中央对用户进行身份验证。该SSO应该返回一个“数据包”,其中包含唯一标识用户��信息,然后将其传递给本地ASP.NET Owin Cookie认证(或替代Forms认证等)。如果由于某种原因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.");

根据HTTP状态码列表,500错误中的一个可能是最合适的:
引用: 以数字“5”开头的响应状态代码表示服务器意识到遇到错误或无法执行请求的情况...

401 未授权。 - Eser
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Jiveman
当服务器由于处理导致出现服务器端问题时,500是适当的状态码。401是您尝试访问安全资源但未经身份验证而获得的结果,因此在这种情况下可能是适当的状态码,为避免循环,可以使用400状态码。 - Max Sorin
“包不包含最少必要信息”的问题是由什么原因引起的?回答这个问题后,可以确定正确的状态码。 - CodeCaster
数据包缺少最小信息的原因在技术上此时尚不清楚。用户可能已经通过SSO进行了身份验证,而SSO并不关心我应用程序所需的“最小信息”。一旦重定向回NET应用程序,它会检查此数据包,如果不满足我的应用程序的要求,则应适当地响应。再次强调,SSO应该包含所有信息,但由于它是外部资源,超出了本地应用程序的控制范围,因此可能会出现问题。 - Jiveman
2个回答

1
错误代码401和错误代码403通常用于与身份验证相关的错误。但是,它们有一些标准,指定了何时以及如何使用它们。在您的情况下,两者都不太适合。例如,403被描述为(http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html):
403 Forbidden 服务器理解请求,但拒绝执行它。授权无法帮助,也不应重复请求。如果请求方法不是HEAD,并且服务器希望公开说明未能满足请求的原因,则应在实体中描述拒绝的原因。如果服务器不希望向客户端提供此信息,则可以改用状态代码404(未找到)。
一个很好的替代方案是返回代码503(服务不可用)。
503 Service Unavailable 服务器当前无法处理请求,因为服务器暂时超载或正在维护。这意味着这是一个暂时的条件,在一段时间后将得到缓解。

嗯,谢谢。仔细阅读后,403 状态码实际上开始听起来更有吸引力了。我的意思是,就本地 ASP.NET 应用程序而言,由于 SSO 返回的信息不足,访问确实是“被禁止”的。它并没有必要深入探讨为什么会发生这种情况,但响应似乎是有道理的。是吧?嗯…… - Jiveman
根据我在原始帖子中提供的链接所述,403的描述是:“请求是有效的,但服务器拒绝响应。 403错误在语义上意味着“未经授权”,即用户没有访问资源所需的必要权限。” 我认为这对我的情况相当适用。 - Jiveman
@Jiveman 由于并非每种情况都有状态码,因此我通常只选择最接近我的情况的状态码。在我看来,这两者之间的关键区别是,在403中不建议重试。对于503,建议重试。403意味着“嘿,我不希望你访问那个资源”,而503则意味着“由于我的某些错误,我无法验证您的身份。稍后再试...也许会被修复。” - DVK

0

客户端身份验证错误应该是401状态码:

401未经授权(RFC 7235)

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

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


我也是这么认为的,刚开始的时候也是这样做的,但这会导致重定向到“登录”页面,而错误就发生在这个页面上,结果我们陷入了无限循环。 - Jiveman

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