【问题标题】:MVC application Authorization for ApiController doesn't workApiController 的 MVC 应用程序授权不起作用
【发布时间】:2019-05-08 15:14:04
【问题描述】:

我正在构建一个 MVC 应用程序,该应用程序在同一个项目中具有标准控制器和 APIController。所有功能都可以正常工作,我可以调用 Controllers 或 APIControllers 没问题。

我想要实现的是确保如果您从外部调用 /api/products 它不应该是可访问的,只有授权用户可以调用它。

我向我的 api 控制器添加了 Authorize 属性,我仍然可以调用它并从像 Postman 这样的客户端应用程序中获取结果。你可以在下面看到我的代码。

 [Authorize] //System.Web.Http
 public class ProductsController : ApiController 

 [HttpGet]
 public IHttpActionResult Get()

这是我的 Startup.Auth.cs 文件中的内容。

 app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Account/Login"),
                Provider = new CookieAuthenticationProvider
                {
                    // Enables the application to validate the security stamp when the user logs in.
                    // This is a security feature which is used when you change a password or add an external login to your account.  
                    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                        validateInterval: TimeSpan.FromMinutes(30),
                        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
                }
            });

如果我注释掉这段代码,我会从 APIController 得到正确的响应,但我也无法登录。

<Error>
<Message>Authorization has been denied for this request.</Message>
</Error>

不知道我错过了什么。据我了解,我不需要为我的 API 控制器创建自定义过滤器,我应该能够使用内置的授权功能。如果您需要更多详细信息或代码示例,请告诉我。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api postman asp.net-authorization


    【解决方案1】:

    我认为 MVC 控制器的身份验证由 Startup.Auth.cs 定义,而 API 控制器的身份验证位于 WebApiConfig.cs

    确保在 Register() 方法中的 WebApiConfig.cs 上调用了 config.SuppressDefaultHostAuthentication();,这会阻止 MVC 控制器上配置的身份验证方法对 ApiController 调用起作用。

    另请注意,在某些情况下,您必须在某些 API 调用(如登录、注册等)中添加 [AllowAnonymous] 属性。

    【讨论】:

      【解决方案2】:

      有趣的发现。我试图在未经授权的情况下从应用程序中调用需要身份验证的 API 控制器,我收到了正确的响应,未授权。我尝试使用 Fiddler 调用 API 端点,结果相同。

      所以由于某种原因,Postman 仍然可以得到没有任何错误的结果。我什至创建了一个具有相同行为的新 API 端点。我将避免使用 Postman,因为即使它是一个很棒的工具,它也会造成很多混乱,结果,我浪费了几个小时。

      希望我的示例能够节省其他人的时间。

      【讨论】:

      • 您是否可能在添加 [Authorize] 属性之前使用了 PostMan,因此它缓存了一个(临时)有效令牌?如果您今天尝试(假设令牌已过期),您会得到相同的结果吗?
      猜你喜欢
      • 2023-03-30
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多