사용자 인증의 몇 가지 측면을 처리하기 위해 사용자 정의 AuthorizeAttribute
을 사용합니다. 권한 부여 중에 값을 확인하려면 데이터베이스에 대한 액세스 권한을 추가해야합니다. 이 프로젝트는 Repository 패턴을 사용하고 Repos는 모두 StructureMap을 통해 컨트롤러 생성자에서 인스턴스화됩니다.ASP.NET의 StructureMap에서 설정 기 주입이 작동하지 않습니다. MVC 인증 필터
불행히도 필터가있는 생성자 삽입을 사용할 방법이 없다고합니다. Jimmy Bogard (http://lostechies.com/jimmybogard/2010/05/03/dependency-injection-in-asp-net-mvc-filters/)가이 시나리오를 처리하기 위해 속성 주입을 사용하는 방법을 설명하는 기사를 발견했습니다. 기본적으로 지미의 코드는 ControllerActionInvoker
에 GetFilters
메서드를 가로 채고 각 필터에서 BuildUp
을 실행하여 속성을 채 웁니다. 이것은 내가 필요로했던 단지, 그래서 나는 다음 클래스 추가 -
public class InjectingActionInvoker : ControllerActionInvoker
{
private readonly IContainer _container;
public InjectingActionInvoker(IContainer container)
{
_container = container;
}
protected override FilterInfo GetFilters(
ControllerContext controllerContext,
ActionDescriptor actionDescriptor)
{
var info = base.GetFilters(controllerContext, actionDescriptor);
info.AuthorizationFilters.ForEach(_container.BuildUp);
info.ActionFilters.ForEach(_container.BuildUp);
info.ResultFilters.ForEach(_container.BuildUp);
info.ExceptionFilters.ForEach(_container.BuildUp);
return info;
}
}
을 그리고이 라인 StructureMap로 유선 -
For<IActionInvoker>().Use<InjectingActionInvoker>();
For<ITempDataProvider>().Use<SessionStateTempDataProvider>();
Policies.SetAllProperties(c =>
{
c.OfType<IActionInvoker>();
c.OfType<ITempDataProvider>();
c.WithAnyTypeFromNamespaceContainingType<UserProfileRepository>();
});
그리고 마지막으로, 나는 내 사용자 지정 AuthorizeAttribute
에 공유 재산을 추가 클래스 -
[SetterProperty]
public UserProfileRepository User { get; set; }
내가 프로젝트를 실행하고 보안 페이지에 액세스, 일 e AuthorizeCore
코드가 두 번 눌립니다. 처음으로, 내 재산이 설정되어 제대로 작동합니다. 그러나 속성이 null이기 때문에 두 번째 호출이 실패합니다. GetFilters
메서드에서 중단 점을 설정하고 처음으로 만 실행됩니다. 불행하게도, 나는 이것이 구조적으로 멀리 떨어져있는 곳을 정확히 알기 위해 StructureMap이나 필터를 충분히 이해하지 못했습니다.
다음은 누군가를 위해 유용이 경우, 호출 스택입니다 -
전화 번호 1
AppName.dll!AppName.Filters.SiteAuthorizeAttribute.AuthorizeCore(System.Web.HttpContextBase httpContext) Line 78 C#
[External Code]
AppName.dll!AppName.Filters.SiteAuthorizeAttribute.OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext) Line 31 C#
[External Code]
전화 번호 2
AppName.dll!AppName.Filters.SiteAuthorizeAttribute.AuthorizeCore(System.Web.HttpContextBase httpContext) Line 69 C#
[External Code]
AppName.dll!AppName.Filters.SiteAuthorizeAttribute.OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext) Line 31 C#
[External Code]
App_Web_1fnmflat.dll!ASP._Page_Views_Shared__Menu_cshtml.Execute() Line 2 C#
[External Code]
App_Web_1fnmflat.dll!ASP._Page_Views_Shared__Layout_cshtml.Execute() Line 51 C#
[External Code]
모든 StructureMap 주인이 어떤 지혜를 공유하는 걱정 ? 어떤 도움을 주셔서 미리 감사드립니다!
편집 : 여기에 _Menu.cshtml
파일에 대한 코드입니다 -
@(Html.Kendo().Menu()
.Name("Menu")
.Items(items =>
{
items.Add().Text("My Dashboard").Action("Dashboard", "Home");
items.Add().Text("My Account").Action("Edit", "Account");
items.Add().Text("Purchase/Renew").Action("Index", "Purchase");
items.Add().Text("Administration")
.Items(children =>
{
children.Add().Text("Accounts").Action("Index", "UserProfile");
children.Add().Text("Coupons").Action("Index", "Coupon");
});
items.Add().Text("Logout").Action("Logout", "Logon");
})
)
감사 NightOwl888에서하라는 일부는 내가 검도 메뉴 호출에 문제를 격리 한에가. _Menu.cshtml
의 마지막 줄에 중단 점을 놓고 들어가면 DoGetInstance가 내 HomeController에 호출됩니다. 완료되면 OnAuthorization이 두 번째로 실행되고 repo 속성은 null입니다.
누구나 내가 여기에서 무엇을 놓치고 있는지 알고 있습니까?
을 나는 당신이 당신의 권한 부여 속성이 두 번 호출되는 이유를 설명하지 않는 한 당신이 답을 찾을 수 있다고 생각하지 않으며, 사람은 두 번째 인스턴스화. GetFilters 메서드가 두 번 호출되고 있습니까? – NightOwl888
죄송합니다. 두 번째 호출은 _Layout.cshtml 파일에서 _Menu.cshtml이라는 이름의 부분 렌더링에서 발생합니다 (호출 스택에서이를 볼 수 있음). –
그리고 GetFilters는 위에서 설명한 것처럼 한 번만 호출됩니다. 클래스가 캐시되고있는 것처럼 느껴지지만 BuildUp이 발생하기 전에 캐시 된 버전이 저장되고 있습니까? 나는 모른다. –