【发布时间】:2012-11-15 18:03:15
【问题描述】:
这让我困惑了一段时间。显然,常见的类似情况似乎都不适用于这里。我可能错过了一些明显的东西,但我看不到它。
在我的 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);
任何想法都会非常感激。
以前有没有人遇到过这个问题并找到了根本原因?
【问题讨论】:
-
确保使用
System.Web.Mvc.AllowAnonymousAttribute而不是System.Web.Http.AllowAnonymousAttribute。它发生在我身上,三个小时后我意识到了......
标签: asp.net-mvc authentication attributes asp.net-web-api