2013-07-09 6 views
0

У меня есть страница ASP.NET MVC с FluentSecurity. Я установил его с помощью Ninject в соответствии с this article. У меня есть DenyAnonymousAccessPolicyViolationHandler, который хорошо работает. Я добавил RequireRolePolicyViolationHandler.FluentSecurity: RequireRolePolicyViolationHandler не получает вызов

В моей установке, я

configuration.For<SettingsController>().RequireRole(CMSRoles.Admin); 

Если я перейти к SettingsController с пользователем без необходимой роли, то RequireRolePolicyViolationHandler не дозвонились. Вместо этого я перенаправлен на страницу LogOn, как определено в web.config.

Я что-то упустил? Согласно документации FluentSecurity, она должна работать.

EDIT: У меня есть обычай RoleProvider зарегистрирован и я использую его с FluentSecurity:

configuration.GetAuthenticationStatusFrom(() => HttpContext.Current.User.Identity.IsAuthenticated); 
configuration.GetRolesFrom(() => Roles.GetRolesForUser(HttpContext.Current.User.Identity.Name)); 

EDIT: Я создал минимальный пример приложения: https://dl.dropboxusercontent.com/u/73642/MvcApplication1.zip. Если вы перейдете в/Записано, что вы перенаправлены на страницу входа, так что работает DenyAnonymousAccessPolicyViolationHandler. Вы можете войти с любым именем пользователя и паролем. Перейдите к Settings, и вы увидите, что вы перенаправлены на страницу входа вместо RequireRolePolicyViolationHandler beeing.

+0

Можете ли вы опубликовать некоторый код, чтобы показать, как вы настраиваете это, чтобы мы могли помочь вам. – lopezbertoni

+0

@lopezbertoni моя настройка точно такая же, как связанная статья –

+0

Пожалуйста, разместите затем свой код DenyAnonymousAccessPolicyViolationHandler. Вероятно, это просто перенаправление на страницу входа. Также сообщите, как вы настраиваете Fluent Security, как вы получаете роли и т. Д.Трудно помочь, не глядя на код. – lopezbertoni

ответ

0

Вот как он у меня настроен, надеюсь, что это помогает:

В App_Start/NinjectWebCommon.cs Я связываю обработчики политики:

kernel.Bind<IPolicyViolationHandler>().To<DenyAnonymousAccessPolicyViolationHandler>(); 
kernel.Bind<IPolicyViolationHandler>().To<RequireRolePolicyViolationHandler>(); 

Я также настроить Fluent безопасности, как это (используя Ninject Service Локатор):

var locator = new NinjectServiceLocator(kernel); 
ServiceLocator.SetLocatorProvider(() => locator); 

SecurityConfigurator.Configure(
      configuration => 
      { 
       configuration.GetAuthenticationStatusFrom(() => HttpContext.Current.User.Identity.IsAuthenticated); 
       configuration.GetRolesFrom(SecurityHelpers.UserRoles); 

       //HomeController and other configurations 
       configuration.For<HomeController>().Ignore(); 

       configuration.ResolveServicesUsing(ServiceLocator.Current.GetAllInstances); 
      } 
      ); 
GlobalFilters.Filters.Add(new HandleSecurityAttribute(), 0); 

Тогда для каждой политики, у меня есть реализация IPolicyViolationHandler

public class RequireRolePolicyViolationHandler : IPolicyViolationHandler 
{ 
    public ActionResult Handle(PolicyViolationException exception) 
    { 
     //Make sure you're redirecting to the desired page here. You should put a stop here to debug it and see if it's being hit. 
     return new HttpUnauthorizedResult(exception.Message); 
    } 
} 

У меня есть рабочее решение с использованием Custom Membership/Role Providers и Fluent Security. Я опубликовал то, что, по моему мнению, является основной конфигурацией. Надеюсь это поможет.

EDIT: Добавлен способ получения ролей.

public static class SecurityHelpers 
{ 
    public static IEnumerable<object> UserRoles() 
    { 
     var currentUser = HttpContext.Current.User.Identity.Name; 
     var roles = Roles.Providers["MemberAccountRoleProvider"]; //Custom Role Provider Name 
     return currentUser != null ? roles.GetRolesForUser(currentUser).Cast<object>().ToArray() : null; 

    } 
} 

EDIT 2: Я посмотрел на свой код и он работает нормально. Добавьте это в свой код, чтобы вы могли перенаправить туда, где хотите. Прямо сейчас вы просто возвращаете результаты Http:

public class RequireRolePolicyViolationHandler : IPolicyViolationHandler 
{ 
    public ActionResult Handle(PolicyViolationException exception) 
    { 
     //return new HttpUnauthorizedResult(exception.Message); 
     return 
      new RedirectToRouteResult(
       new RouteValueDictionary(new { action = "Test", controller = "Account"})); //Created a view for testing 
    } 
} 

Когда я пытаюсь получить страницу настроек я поражая RequireRolePolicyViolationHandler. Settings Page Debugger

+0

Я думаю, что единственное различие заключается в том, как мы получаем роли для пользователя. Это может быть проблема? Материал Ninject эквивалентен –

+0

@IgorKulman Я обновил, чтобы показать, как я действительно получаю роли. Мне сложно сказать, если это проблема, но вы можете попробовать. – lopezbertoni

+0

Без изменений, я получаю то же поведение –