11

現在、MVC 4 Web API プロジェクト タイプを使用して Web API を開発しています。現在、API にセキュリティを追加する必要がある段階にあります。私は Authorize 属性を認識していますが、クライアントは別のアプローチを好むでしょう。このために、私は自分のクラスで Authorize 属性をオーバーライドしようとしました。基本的な開始点として、AuthorizeCore が常に false を返すようにしました。これは、認証されていないことを意味します。これをコントローラー内のアクションに追加すると、アクションは常に完了し、常にデータを取得します。カスタム属性が web.config ファイルに登録されていないことが原因である可能性があると思いますが、フォーム認証を使用しない場合にこれを行う方法がわかりません。

テストに使用しているコードは、以下に示すカスタム属性を持つ新しい MVC 4 Web API プロジェクトです。

public class Auth : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return false;
    }
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectResult("http://www.google.com");
    }
}

次に、属性をデフォルトの ValuesController の Get メソッドに追加しました。

[Auth]
public IEnumerable<string> Get()

ただし、domain/api/Values に移動すると、予想される Google へのリダイレクトではなく、常にデータが表示されます。どんな助けでも大歓迎です。

編集: もう少し調べた後、ここでこれを見つけました: http://weblogs.asp.net/jgalloway/archive/2012/05/04/asp-net-mvc-authentication-customizing-authentication-and-authorization-the -right-way.aspxこれは、System.Web.Http からではなく System.Web.MVC から 1 つを選択したため、間違った AuthorizeAttribute クラスを選択したことを示唆しています。AuthorizeCore をオーバーライドできないため、Http バージョンでは MVC バージョンと同じレベルの構成が許可されていないようです。これに関するこれ以上の助けをいただければ幸いです。

4

2 に答える 2

9

この問題は、AuthorizeAttribute の間違ったバージョンを使用したために発生したようです。System.Web.Http にあるバージョンを使用した後、ユーザーが必要なアクセス許可を持っていない場合、コードは正しいエラー コードを返します。例として、ここに元の質問に入れたものと同等のコードがあります

using System;
using System.Web.Http;
using System.Net.Http;

public class AuthAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        HandleUnauthorizedRequest(actionContext);
    }

    protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        var response = actionContext.Request.CreateResponse(System.Net.HttpStatusCode.Redirect);
        response.Headers.Add("Location", "http://www.google.com");
        actionContext.Response = response;
    }
}
于 2012-10-14T14:13:11.967 に答える
3

WebApi の場合、オーバーライドで指定することにより、正しい AuthorizeAttribute クラスを強制的にオーバーライドできます。また、リダイレクトを行う意味はありません。これは、API に適した未承認の Web 応答を返すだけです。

namespace WebApiTest
{
    public class Auth : System.Web.Http.AuthorizeAttribute
    {
        protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            return false;
        }

    }
}
于 2012-10-14T13:04:40.547 に答える