2012-06-04 5 views
1

MVC3 프로젝트와 함께 ASP.NET 웹 API 프로젝트가 나란히 있습니다. 두 프로젝트 모두에서 Ninject는 종속성 확인자로 구성됩니다.종속성 주입과 관련된 Ninject 및 Asp.Net 웹 API 문제

내 API에 대한 수신 요청을 인증하기 위해 자체 인증 속성을 작성 중이므로 웹 API 프로젝트에 문제가 있습니다. 이 속성에서 요청에 대한 몇 가지 검증을 수행하려면 몇 가지 종속성을 주입해야합니다.

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에서 액세스 할 수 있습니다.

MVC3 프로젝트 (웹 사이트)에서 수정하기 전까지는 모든 것이 완벽합니다. 예를 들어 웹 사이트에는 사용자 암호 변경을 담당하는 기능이 있습니다. 초기 암호 123456이 있다고 가정합니다. HttpBasic을 사용하여 API에서 요청을하면 api는 http 상태 202에 응답합니다.

이제 웹 사이트의 암호를 1234567로 변경하고 이전 암호를 사용하여 API에서 다른 요청을 수행합니다 (123456), 202에 응답합니다. 이것은 매우 잘못되었습니다.

_userService 개체가 제대로 작동하지 않으며 다른 두 개체가 주입되지 않았습니다. 내가 작업 필터를 디버깅 할 때 전체 개체가 이전 상태임을 알 수 있습니다. Im을 추측하는 것은 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>(); 

그것은 내가로 _userService를 주입하고있어 가치가 언급의 다음 Ninject에 모듈 파일에

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

: NinjectWebCommon.cs에서

:

이 내가 Ninject에 구성하는 방법입니다 내가 생성자 패턴을 사용할 수 없기 때문에, 속성 주입 패턴을 사용하는 ActionFilterAttribute. 이것이 문제인지 나는 모른다.

도와주세요! 나는 여기에서 약간 잃어버린다!

답변

0

CustomAuthorizeAttribute를 작업에 바인딩하는 방법은 무엇입니까? 글로벌 필터입니까 아니면 액션 단위입니까? 귀하의 서비스/etc. 메모리에 상태를 저장 하시겠습니까?

불행히도 문제를 디버그하는 데 도움이되는 많은 정보가 여기에 없습니다. 아마도 암호 변경이 어떻게 수행되고 202 응답을 되돌려 보내야하는지에 대한 자세한 정보를 게시 할 수 있습니까?

관련 문제