我正在构建一个在同一项目中具有标准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控制器创建自定义过滤器,我应该能够使用内置的授权功能。让我知道是否需要更多详细信息或代码示例。
答案 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,因为即使它是一个很棒的工具,也会造成很多混乱,结果,我浪费了几个小时。
希望我的示例可以节省其他人的时间。