为什么 Mvc.AuthorizeAttribute 和 Http.AuthorizeAttribute 在 Windows 身份验证中对未授权状态有不同的行为
Why Mvc.AuthorizeAttribute and Http.AuthorizeAttribute have different behavior for Unauthorized Status in Windows Authentication
我目前正在使用 Windows 身份验证的应用程序出现问题。
我有应用了自定义 AuthorizeAttribute 的 MVC Controller 和 ApiController。当 Mvc.Authorization 在 MVC 中失败时,我可以将其重定向到错误页面,但对于 Http.Authorization 我只能将 return IsAuthorized 设置为 true 或 false,它会显示一个与登录模式相同的模式对话框for Windows 用户未授权时的身份验证。我找不到正确的解释为什么会这样。我可以定制吗?他们都是 return 401 状态,但为什么他们有不同的行为?
您提到的是预期行为。
Asp.NET MVC 通常为浏览器客户端提供网页,因此在未经授权访问任何资源的情况下,您将用户从服务器本身重定向到另一个页面(视图),您可以在其中显示 error/message 给用户。因此,您的响应是重定向到另一个页面,而不是未经授权的 401 状态代码。
但是 ASP.NET WebAPI 是一项应该被其他应用程序使用的服务,它们的输出通常是数据而不是特定的视图。因此,当识别出未经授权的访问时,网络 API 会返回状态代码 401。(这是一种预期的行为)。
现在,如果您尝试通过浏览器访问网络 api,并且它从服务器收到未经授权的响应,它会向用户显示一个弹出窗口,让用户有机会提供凭据并点击 api再次连同凭据。
我目前正在使用 Windows 身份验证的应用程序出现问题。
我有应用了自定义 AuthorizeAttribute 的 MVC Controller 和 ApiController。当 Mvc.Authorization 在 MVC 中失败时,我可以将其重定向到错误页面,但对于 Http.Authorization 我只能将 return IsAuthorized 设置为 true 或 false,它会显示一个与登录模式相同的模式对话框for Windows 用户未授权时的身份验证。我找不到正确的解释为什么会这样。我可以定制吗?他们都是 return 401 状态,但为什么他们有不同的行为?
您提到的是预期行为。
Asp.NET MVC 通常为浏览器客户端提供网页,因此在未经授权访问任何资源的情况下,您将用户从服务器本身重定向到另一个页面(视图),您可以在其中显示 error/message 给用户。因此,您的响应是重定向到另一个页面,而不是未经授权的 401 状态代码。
但是 ASP.NET WebAPI 是一项应该被其他应用程序使用的服务,它们的输出通常是数据而不是特定的视图。因此,当识别出未经授权的访问时,网络 API 会返回状态代码 401。(这是一种预期的行为)。
现在,如果您尝试通过浏览器访问网络 api,并且它从服务器收到未经授权的响应,它会向用户显示一个弹出窗口,让用户有机会提供凭据并点击 api再次连同凭据。