2

Я разработал собственные классы для поставщиков пользовательских членства и роли.Проблемы с IIS и поставщиком пользовательского членства + поставщик пользовательских ролей

Все работает локально. Тем не менее, после развертывания решения для IIS для тестирования, мое действие для входа, похоже, работает (по крайней мере, действие проверяет имя пользователя + пароль, и пользователь оказывается аутентифицированным), но всякий раз, когда я пытаюсь получить доступ к действиям, которые украшены аннотациями вроде

[Authorize(Roles="Employee, Admin")] 

Я постоянно переадресовываюсь на страницу входа, как если бы у пользователя не было необходимой роли (хотя он и есть).

Поэтому локально приложение успешно проверяет пользователей и проверяет роли аутентифицированного пользователя перед выполнением действий (таким образом, я предполагаю, что мои методы на обоих классах верны), но в IIS похоже, что поставщик роли не работает должным образом , Кто-нибудь знает, где я могу быть неправ, или как я могу лучше рассмотреть мою проблему?

В моей Web.Config:

<system.web> 
(...) 
<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="2880" /> 
</authentication> 
<membership defaultProvider="CustomMembershipProvider"> 
    <providers> 
    <clear /> 
    <add name="CustomMembershipProvider" type="MyApplication.Infrastructure.CustomMembershipProvider" connectionStringName="DBEntities" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> 
    </providers> 
</membership> 
<roleManager enabled="true" defaultProvider="CustomRoleProvider"> 
    <providers> 
    <clear /> 
    <add name="CustomRoleProvider" type="MyApplication.Infrastructure.CustomRoleProvider" connectionStringName="DBEntities" applicationName="/" /> 
    </providers> 
</roleManager> 
(...) 
</system.web> 

Спасибо заранее.

EDIT: Дополнительная информация.

  • Я только изменил один из моих действий этой заметки просто [Авторизоваться], и это работает. Поэтому я считаю, что аутентификация работает, и проблема должна быть связана с поставщиком ролей.

  • Я использую Entity Framework для моей модели данных, con. строка выглядит следующим образом:

  • мне удалось зарегистрировать пользователь и войти, используя эту вновь созданную учетную запись, которая будет означать, что соединение DB и поставщик пользовательского членства работают правильно (?).

  • A «@foreach (String ул в Roles.GetRolesForUser (Пользователь.Идентичность.Имя)) {@} ул печатает роль на местном уровне и ничего не печатается при развертывании.

+0

Обнаруживает строку подключения? – Fals

+1

Вы уверены, что роли существуют, и пользователям назначены роли? –

+0

Да, просто дважды проверено. Экземпляр DB, который я использую для тестирования локально, тот же, который я использую, когда я развертываю в IIS. Поэтому, если роли существуют и распознаются локально, проблемы не должно быть. – user1987392

ответ

1

Хорошо, я установил его Вот объяснение в случае, если кто-то нуждается в будущем:...

После на вырисовывая причины (как видно из моих прав), я понял, что проблема должна быть связана с моим CustomRoleProvider.

Этот класс имеет такие методы, как этот:

public override string[] GetRolesForUser(string Username) 
    { 
     List<string> roles = new List<string>(); 

     using (DBEntities _db = new DBEntities()) 
     { 
      try 
      { 
       var dbRoles = from r in _db.UserRole 
           where r.Users.Username == Username 
           select r; 

       foreach (var role in dbRoles) 
       { 
        roles.Add(role.Role.Name); 
       } 
      } 
      catch 
      { 
      } 
     } 

     return roles.ToArray(); 
    } 

Так я ловлю исключение, и ничего с ним не делать.Я снял блок примерочных поймать, и получил это сообщение:

There is already an open DataReader associated with this Command which must be closed first. 

немного stackoverflowing, и я нашел это: There is already an open DataReader associated with this Command which must be closed first

Оказывается, моя локальная строка подключения была MultipleActiveResultSets=true но строка соединения на моих параметрах публикации не сделал. Я изменил настройки публикации и вуаля, похоже, сейчас работает.

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

+0

Если вы публикуете свой собственный ответ, вы должны принять его как ответ. –

+0

Эй, Крис, сделаю, но я должен ждать 2 дня или около того :) – user1987392

0

У меня есть была аналогичная проблема После добавления MachineKey в web.config все работает хорошо

<system.web> 
<machineKey validationKey="2E417D4AC04F20FA6CE1CF1EFE23FBF1695BF6981B605B1B8628D2182C43D0B10E48C4A83FDCE0D1D6300095D9EE1B8746A37E2C3256554405983DCAA7622875" decryptionKey="FA6D35C22BF7E5E9E4438052B924CCC017521137C5EB017D07C7038B80C5F726" validation="SHA1" decryption="AES" /> 
    </system.web> 
+0

Привет. Я только что попробовал (с помощью этой ссылки: http://www.codeproject.com/Articles/221889/How-to-Generate-Machine-Key-in-IIS7), но, к сожалению, это не сработало. – user1987392

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

  • Нет связанных вопросов^_^