59

これは私をしばらく困惑させました。よく遭遇する同様の状況は、明らかにここには当てはまらないようです。明らかな何かを見落としている可能性がありますが、それを見ることはできません。

私の Mvc Web アプリケーションでは、Authorize 属性と AllowAnonymous 属性を使用して、サイトの安全な領域をロックダウンするのではなく、アクションを明示的に公開する必要があるようにしています。私はそのアプローチをはるかに好みます。ただし、WebAPI で同じ動作を得ることができません。

System.Web.Http.AuthorizeAttribute から継承するカスタム Authorization Attribute を次のように記述しました。

[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")
        };
    }
}

最も一般的なシナリオは、2 つの 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);

どんな考えも本当に感謝しています。

以前にこの問題に遭遇し、根本的な原因を見つけた人はいますか?

4

8 に答える 8

98

AuthorizeAttribute には、次のコードがあります。

private static bool SkipAuthorization(HttpActionContext actionContext)
{
    Contract.Assert(actionContext != null);

    return actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any()
               || actionContext.ControllerContext.ControllerDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any();
}

このメソッドを AuthorizeAttribute クラスに含め、OnAuthorization メソッドの先頭に以下を追加して、AllowAnonymous 属性が見つかった場合に承認をスキップします。

if (SkipAuthorization(actionContext)) return;
于 2012-11-28T00:42:55.183 に答える
36

ASP.NET MVC 4:

bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
                         || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true);

また

 private static bool SkipAuthorization(AuthorizationContext filterContext)
    {
        Contract.Assert(filterContext != null);

        return filterContext.ActionDescriptor.GetCustomAttributes(typeof(AllowAnonymousAttribute), true).Any()
               || filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(AllowAnonymousAttribute), true).Any();
    }

ソース: http://weblogs.asp.net/jongalloway/asp-net-mvc-authentication-global-authentication-and-allow-anonymous

于 2014-12-01T10:52:20.100 に答える