这让我难倒了一段时间。显然,常见的类似情况似乎都不适用于这里。我可能错过了一些明显的东西,但我看不到它。
在我的 Mvc Web 应用程序中,我使用 Authorize 和 AllowAnonymous 属性的方式是,您必须明确地将操作公开为公开可用,而不是锁定站点的安全区域。我更喜欢这种方法。但是,我无法在我的 WebAPI 中获得相同的行为。
我编写了一个继承自 System.Web.Http.AuthorizeAttribute 的自定义授权属性,其内容如下:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class MyAuthorizationAttribute : System.Web.Http.AuthorizeAttribute
我已将此注册为过滤器:
public static void RegisterHttpFilters(HttpFilterCollection filters)
{
filters.Add(new MyAuthorizationAttribute());
}
这一切都按预期工作,没有凭据将不再可用。问题是现在以下方法将不允许 AllowAnonymous 属性执行此操作:
[System.Web.Http.AllowAnonymous]
public class HomeController : ApiController
{
[GET("/"), System.Web.Http.HttpGet]
public Link[] Index()
{
return new Link[]
{
new SelfLink(Request.RequestUri.AbsoluteUri, "api-root"),
new Link(LinkRelConstants.AuthorizationEndpoint, "OAuth/Authorize/", "authenticate"),
new Link(LinkRelConstants.AuthorizationTokenEndpoint , "OAuth/Tokens/", "auth-token-endpoint")
};
}
}
最常见的情况似乎是混淆了两个 Authorize / AllowAnonymous 属性。System.Web.Mvc 用于 Web 应用程序,而 System.Web.Http 用于 WebAPI(无论如何我都理解)。
我使用的两个属性都来自同一个命名空间——System.Web.Http。我假设这只会继承基本功能并允许我在 OnAuthotize 方法中注入我需要的代码。
根据文档, AllowAnonymous 属性在我立即调用的 OnAuthorize 方法中起作用:
public override void OnAuthorization(HttpActionContext actionContext)
{
base.OnAuthorization(actionContext);
任何想法将不胜感激。
有没有人遇到过这个问题并找到了根本原因?