HTTP响应是404而不是带有authorization.json的401。我是否缺少某些内容?

时间:2018-11-16 15:44:03

标签: azure authentication webforms asp.net-web-api2 azure-web-app-service

在Azure应用服务论坛中发布了此消息,但没有任何回应,因此...

框架为4.7.1

应用程序是带有两个Web API控制器的ASP.Net Web表单。
网站和HealthCheck控制器应允许匿名请求。 另一个控制器应使用证书作为凭据通过Azure Active Directory进行身份验证。

App Service中的身份验证设置为

  • 允许匿名请求(不执行任何操作)
  • 身份验证提供程序设置为Azure Active Directory
  • 管理模式设置为“快速”
  • 证书已添加到管理应用程序中

唯一的问题是,当匿名请求命中安全控制器时,将返回HTTP 404而不是401。

如果发出了经过身份验证的请求,则返回HTTP 200。 我是否缺少某些配置设置?

这是Application_Start中Global.asax.cs中的路线图

RouteTable.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = System.Web.Http.RouteParameter.Optional }
);

这是authorization.json文件

{
  "routes": [{
      "path_prefix": "/",
      "policies": { "unauthenticated_action": "AllowAnonymous" }
    },
    {
      "path_prefix": "/api",
      "policies": { "unauthenticated_action": "RejectWith401" }
    },
    {
      "http_methods": [ "GET"],
      "path_prefix": "/api/HealthCheck",
      "policies": { "unauthenticated_action": "AllowAnonymous" }
    }]
}           

2 个答案:

答案 0 :(得分:0)

您的文件authorization.json必须存在问题。除此/api之外,还有其他子目录吗?也尝试添加它们,并在/api/(*whatever path*)中添加path_prefix

答案 1 :(得分:0)

问题是表单身份验证重定向检测到401,并试图重定向到在forms元素的loginUrl属性中未正确指定的登录页面。 global.aspx.cs文件的Application_BeginRequest中的这段代码解决了我的问题

            var context = new HttpContextWrapper(Context);
        // set flag only if forms auth enabled and request comes from ajax
        if (FormsAuthentication.IsEnabled && context.Request.Url.AbsolutePath.StartsWith("/api",StringComparison.CurrentCultureIgnoreCase))
        {
            context.Response.SuppressFormsAuthenticationRedirect = true;
        }

在Azure中打开详细日志记录(由Microsoft建议)表明,身份验证正在返回401。那时,我知道正在发生重定向,并且它很可能构成身份验证。此链接还帮助我找出了解决方法

https://haacked.com/archive/2011/10/04/prevent-forms-authentication-login-page-redirect-when-you-donrsquot-want.aspx/