ASP.NET MVC3 IAвторизационный фильтр Зависимость Ninject - PullRequest
4 голосов
/ 12 апреля 2011

В настоящее время я пытаюсь настроить внедрение зависимостей и переопределить атрибут авторизации.Я пытался следовать нескольким примерам, хотя, кажется, всегда получаю ошибки.

Global.asax

public class MvcApplication : Ninject.Web.Mvc.NinjectHttpApplication
{
    private class MyModule : NinjectModule
    {
        public override void Load()
        {
            this.BindFilter<SageAdminAuthorizationFilter>(FilterScope.Controller, 0);
            Bind<IAuthentication>().To<CustomAuthenticationService>();
        }
    }

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }

    protected override void OnApplicationStarted()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

    protected override IKernel CreateKernel()
    {
        var modules = new INinjectModule[] {
        new MyModule()
    };
        var kernel = new StandardKernel(modules);

        return kernel;
    }
}

Фильтр аутентификации

public class CustomAuthenticationService : IAuthentication
{
    public void SignIn(string claimedIdentifier, bool createPersistentCookie)
    {
        //Write Sign in code here
        FormsAuthentication.SetAuthCookie(claimedIdentifier, createPersistentCookie);
    }

    public void SignOut()
    {
        FormsAuthentication.SignOut();
    }

    public bool Authorize(HttpContextBase httpContext)
    {
        //Check here if the user can administer the  admin
        return false;
    }
}

//The Authorization attribute on a controller
public class CustomAdminAuthorizationFilter : IAuthorizationFilter
{
    private readonly IAuthentication _authentication;

    public SageAdminAuthorizationFilter(IAuthentication authentication)
    {
        _authentication = authentication;
    }

    public void OnAuthorization(AuthorizationContext filterContext)
    {
        _authentication.Authorize(filterContext.HttpContext);
    }
}

Я всегда получаю

Последовательность не содержит элементов.

Любая помощь приветствуется.

Обновление: я все еще получаю ту же ошибку.

Вызовстек выглядит следующим образом

Поиск источника для 'c: \ Projects \ Ninject \ ninject.web.mvc \ mvc3 \ src \ Ninject.Web.Mvc \ NinjectHttpApplication.cs'.Контрольная сумма: MD5 {3d e3 7f 86 44 70 дБ 0 3c 6f e0 97 fb 1e 12 13} Файл 'c: \ Projects \ Ninject \ ninject.web.mvc \ mvc3 \ src \ Ninject.Web.Mvc \ NinjectHttpApplication.cs' не существует.Поиск в документах сценария для 'c: \ Projects \ Ninject \ ninject.web.mvc \ mvc3 \ src \ Ninject.Web.Mvc \ NinjectHttpApplication.cs' ... Поиск проектов для 'c: \ Projects \ Ninject \ ninject.web.mvc \ mvc3 \ SRC \ Ninject.Web.Mvc \ NinjectHttpApplication.cs.Файл не найден в проекте.Поиск в каталоге 'C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ crt \ src \' ... Поиск в каталоге 'C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ atlmfc \src \ mfc \ '... Поиск в каталоге' C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ atlmfc \ src \ atl \ '... Поиск в каталоге' C: \ Program Files (x86)\ Microsoft Visual Studio 10.0 \ VC \ atlmfc \ include \ '... Параметры исходных файлов отладки для активного решения указывают, что отладчик не будет просить пользователя найти файл: c: \ Projects \ Ninject \ ninject.web.MVC \ mvc3 \ SRC \ Ninject.Web.Mvc \ NinjectHttpApplication.cs.Отладчику не удалось найти исходный файл 'c: \ Projects \ Ninject \ ninject.web.mvc \ mvc3 \ src \ Ninject.Web.Mvc \ NinjectHttpApplication.cs'.

Я установил Ninject и Ninject.MVC3 от Nuget.Это выглядит, хотя он пытается найти файлы для отладки.Кто-нибудь сможет дать мне какую-либо информацию о том, почему это происходит.

Я также получаю эту ошибку

[InvalidOperationException: последовательность не содержит элементов] System.Linq.Enumerable.Single (IEnumerable 1 source) +320 Ninject.Web.Mvc.Bootstrapper.Initialize(Func 1 createKernelCallback) в c: \ Projects \ Ninject \ ninject.web.mvc \ mvc3 \ src \ Ninject.Web.Mvc \ Bootstrapper.cs: 67 Ninject.Web.Mvc.NinjectHttpApplication.Application_Start () в c: \ Projects\ Ninject \ ninject.web.mvc \ mvc3 \ SRC \ Ninject.Web.Mvc \ NinjectHttpApplication.cs: 65

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

Фильтры действий должны быть зарегистрированы с использованием следующего синтаксиса:

public override void Load()
{
    BindFilter<CustomAdminAuthorizationFilter>(FilterScope.Controller, 0);
    Bind<IAuthentication>().To<CustomAuthenticationService>();
}

Вы также можете применить фильтр условно .

Примечание: не вижу никакой связи с классом NinjectDependencyResolver, который вы показываете в своем вопросе. Это уже встроено в ninject.mvc3, и вы не должны писать его вручную.

0 голосов
/ 28 апреля 2011

http://social.msdn.microsoft.com/Forums/en/vsdebug/thread/933f62dd-80e5-4ef3-9199-9e9abfefeadf

решено снятием флажка «Требовать, чтобы исходные файлы точно соответствовали исходной версии» в

Tools --> Options --> Debugging --> General 

Для саентологов нет фруктов

...