2014-01-08 4 views
9

У меня есть контроллер, который защищен атрибутом [Authorize].AuthorizeAttribute с идентификатором ASP.NET

Это работает очень хорошо (меня отправляют обратно в систему, если я не вошел в систему), но я хочу добавить некоторые роли в этот атрибут, я прочитал, что его можно сделать примерно как [Authorize(Roles = "Customer"], но когда я это сделаю это мгновенно отправляется на страницу входа в мое приложение?

Это Roles переопределить работу с новой идентификацией ASP.NET? На моем создании пользователя я добавляю от пользователя к следующему коду:

var user = new ApplicationUser {UserName = model.Username}; 
var result = UserManager.Create(user, model.Password); 
if (result.Succeeded) 
{ 
    UserManager.AddToRole(user.Id, "Customer"); 
    SignIn(user, false); 

    return RedirectToAction("Done"); 
} 

И согласно базе данных пользователя находится в этой роли. Почему это не работает? У меня отсутствует какая-либо конфигурация?

+0

Вы уверены, что пользователь находится в роли клиента? – user1477388

+0

Да, клиент исходит из константы Я использую – janhartmann

+0

Я имею в виду, когда вы идете в Project -> Конфигурация ASP.NET, перейдите на вкладку безопасности и нажмите «Создать/Управление ролями». Проверьте свою роль. Затем перейдите к пользователям и проверьте для своего пользователя. Обязательно ознакомьтесь с частью 7 демонстрации музыки для Microsoft http://www.asp.net/mvc/tutorials/mvc-music-store/mvc-music-store-part-7 – user1477388

ответ

9

Я собираюсь ответить на свой вопрос.

Причина этого не работает (часов копался), потому, что мой контекст был следующий:

Configuration.ProxyCreationEnabled = false; 

Это сделало lazyloading инвалидов и поэтому роли не включены, когда пользователь был загружен!

Таким образом, исправление заключалось в том, чтобы включить это или удалить линию.

UPDATE: 2015-05-01

Это была ошибка, исправлена ​​в 2.0.0-альфа1 выпуска. Таким образом, это обходное решение больше не требуется в будущем, и Роли будут загружаться независимо от этой настройки.

Does Identity Owin require LazyLoading?

+2

wow! попали в ту же проблему, провели всю прошлую ночь, пытаясь понять, почему претензии не загружаются для пользовательских ролей! Отличный улов, спасибо! –

+0

Приятная находка. Кроме того, я часами почесывал голову. Я не уверен, почему ему нужно полагаться на ленивую загрузку, чтобы получить роли для пользователя. Хотелось бы увидеть более глубокое понимание этого. Кто угодно? –

+0

Я не могу воспроизвести это поведение с последней версией ASP.Net Identity. У меня была другая проблема, которая привела меня к этому сообщению, однако, ни Configuration.ProxyCreationEnabled = false, ни переключение Configuration.LazyLoadingEnabled имеет значение. Он загружает роли в обоих случаях. –

0

Создайте роль, как так:

RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new MyDbContext())); 
var roleresult = RoleManager.Create(new IdentityRole(roleName)); 

Затем добавьте пользователя следующим образом:

var currentUser = UserManager.FindByName(user.UserName); 
var roleresult = UserManager.AddToRole(currentUser.Id, "Superusers"); 

Пожалуйста, дайте мне знать, если это работает для вас.

+0

Это уже способ создания ролей и добавления пользователей к ролям, проблема в том, что проверка роли является ложной. – janhartmann

0

Он отлично работает с идентификатором AspNet в моем случае. Вы уверены, что:

  • не настроили фильтры авторизации или сделали это правильно?
  • не перенастроили аутентификацию/авторизацию в web.config?
  • имеют правильные записи в таблицах Identity AspNet: AspNetUsers, AspNetRoles, AspNetUserRoles (роль существует и у пользователя есть)?
+0

Как должно выглядеть авторизация в web.config? Я не использую другие фильтры, кроме обработки ошибок. – janhartmann

+0

Есть ли в вашем web.config элементы, называемые аутентификацией или авторизацией, каковы значения? –

+0

Нет, нет. Я даже попытался поместить значение по умолчанию: вместе с - и не везет. – janhartmann

0

Checkout этот ответ: ASP.NET Identity check user roles is not working

В вашем случае, при проверке в случае, сравнить случай IdentityRole записи и уполномочить атрибута. Не сравнить с UserManager.AddToRole(user.Id, "Customer");

0

я пишу образец, чтобы проверить это, она работает good.so я думаю, что есть 2 точки
1.you печенье не сохранить в браузер
2.you куков не с информацией

ролей

Проверьте, есть ли файл cookie с именем «.AspNet.ApplicationCookie»(имя по умолчанию)
если не так, проверьте вы Broswer разрешить запись куки, или код, который вы пишите печенье
если exsit, вы можете создать класс расширяет

ISecureDataFormat<AuthenticationTicket> 

и конфигурации

app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login"), 
      TicketDataFormat=new T() 

     }); 

новый T() является класс
в этом классе вам нужно сделать

public string Protect(AuthenticationTicket data) 

и

public AuthenticationTicket Unprotect(string protectedText) 

это некоторая вещь о сериализации
вы можете установить точку останова, и проверьте данные,
в data.Identity.Claims (а IEnumerable < претензии>) должны иметь претензии с ваша информация о роли

Смежные вопросы