ApiController的MVC应用程序授权不起作用

时间:2018-12-06 21:00:24

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

我正在构建一个在同一项目中具有标准Controllers和APIControllers的MVC应用程序。所有功能均正常运行,我可以毫无问题地调用Controllers或APIControllers。

我要实现的目的是确保如果您从外部调用/ api / products不能被访问,只有授权用户才能调用它。

我向api控制器添加了并授权属性,但我仍然可以调用它并从诸如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控制器创建自定义过滤器,我应该能够使用内置的授权功能。让我知道是否需要更多详细信息或代码示例。

2 个答案:

答案 0 :(得分:0)

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

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

还要注意,在某些情况下,您必须在登录,注册等API调用中添加[AllowAnonymous]属性。

答案 1 :(得分:0)

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

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

希望我的示例可以节省其他人的时间。