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をインジェクションしていることは言及する価値があります。これが問題かどうかはわかりません。
助けてください!私はここでちょっと迷っています!