1

ASP.NETWebAPIプロジェクトとMVC3プロジェクトが並んでいます。どちらのプロジェクトでも、Ninjectは依存関係リゾルバーとして構成されています。

APIへの着信リクエストを承認するために、独自のAuthorization属性を記述しているため、WebAPIプロジェクトで問題が発生しています。この属性では、リクエストに対していくつかの検証を実行するために、いくつかの依存関係を注入する必要があります。

したがって、属性のコードは次のようになります。

public class CustomAuthorizeAttribute : ActionFilterAttribute 
{
    public string Roles { get; set; }

    [Inject]
    public IAuthSchemaSelector _schemaSelector { private get; set; }

    [Inject]
    public IUserService _userService { private get; set; }

    [Inject]
    public IRoleVerifier _roleVerifier { private get; set; }

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        try
        {
            var principal = _schemaSelector.Authorize(actionContext.Request, Roles, _userService, _roleVerifier);
            actionContext.Request.Properties["MS_UserPrincipal"] = principal;
        }
        catch (Exception ex)
        {
            //create error response with proper http status
        }
    }
}

}

_schemaSelectorは、クライアントがAPIに含まれるサービスを要求するために使用する承認スキーマを決定します(これは、OAuth、APIキー承認などのさまざまなスキーマをサポートすることを計画しているためです。現在はHttpBasicを使用しています)。したがって、eveythignに問題がなければ、プリンシパルユーザーを設定して、ApiControllerでアクセスできるようにします。

WebサイトであるdeMVC3プロジェクトから変更を加えるまで、すべてが完璧になります。たとえば、Webサイトには、ユーザーパスワードの変更を処理する機能があります。初期パスワード123456があるとします。HttpBasicを使用してAPIからリクエストを行うと、APIはhttpステータス202に応答します。

ここで、パスワードをWebサイトから1234567に変更し、古いパスワード(123456)を使用してAPIから別の要求を実行すると、202と応答しますが、これは非常に間違っています。

_userServiceオブジェクトが正しく動作していません(他の2つのオブジェクトも挿入されていません)。アクションフィルターをデバッグすると、オブジェクト全体が以前の状態になっていることがわかります。ninjectの設定方法が間違っていると思います。

これが私がninjectを設定した方法です:

NinjectWebCommon.csの場合:

GlobalConfiguration.Configuration
            .ServiceResolver
            .SetResolver(t => kernel.TryGet(t),
                         t => kernel.GetAll(t));

ninjectモジュールファイル内:

kernel.Bind<IUserService>().To<UserService>(); //user service is part of the unit of work
kernel.Bind<IUnitOfWork>().To<EFUnitOfWork>().InRequestScope();
kernel.Bind<IRoleVerifier>().To<RoleVerifier>();
kernel.Bind<IAuthSchemaSelector>().To<AuthSchemaSelector>();

コンストラクターパターンを使用できないため、プロパティインジェクションパターンを使用してActionFilterAttributeに_userServiceをインジェクションしていることは言及する価値があります。これが問題かどうかはわかりません。

助けてください!私はここでちょっと迷っています!

4

1 に答える 1

0

CustomAuthorizeAttribute をどのようにアクションにバインドしていますか? グローバル フィルターですか、それともアクションごとですか? あなたのサービスはありますか?状態をメモリに保存しますか?

残念ながら、問題のデバッグに役立つ情報はあまりありません。おそらく、パスワードの変更方法や 202 応答の返送の原因などについて、さらに詳しい情報を投稿できますか?

于 2012-08-14T10:22:24.957 に答える