Использование пользовательских MembershipProvider и Roleprovider в IIS 7.0 - PullRequest
0 голосов
/ 17 января 2012

Я пишу веб-сайт ASP.NET MVC 3. Это мой пользовательский MembershipProvider (реализован только ValidateUser):

public class RFMMembershipProvider : MembershipProvider
{
    IUserService userService = new UserService();

    public override bool ValidateUser(string username, string password)
    {
        return password.GetHashCode().ToString() == userService.GetUser(username).Pass;
    }
...
}

и мой Roleprovider (реализован только GetRolesForUser)

public class RFMRoleProvider : RoleProvider
{
    IUserService userService = new UserService();

    public override string[] GetRolesForUser(string username)
    {
        return new string[] { userService.GetRolesForUser(username).Name };
    }
...
}

my web.config part

...
<system.web>

<roleManager enabled="true" defaultProvider="RFMRoleProvider">
  <providers>
    <clear/>
    <add name="RFMRoleProvider" type="RFMSite.WebUI.RFMRoleProvider, RFMSite"/>
  </providers>
</roleManager>

<membership defaultProvider="RFMMembershipProvider"
            >
  <providers>
    <clear/>
    <add name="RFMMembershipProvider"
         type="RFMSite.WebUI.RFMMembershipProvider, RFMSite"
         />
  </providers>
</membership>

<authentication mode="Forms" >
  <forms loginUrl="~/Account/LogOn" timeout="2880">
  </forms>
</authentication>

при действии входа в систему:

...
 if (Membership.ValidateUser(username, password))
            {
                FormsAuthentication.SetAuthCookie(username, true);
                return RedirectToAction("Files", "Admin");
            }
...
return View();

Итак, вопрос в том, почему, когда я публикую сайт на IIS 7.0 Membership.ValidateUser(username, password) всегда возвращает ложь? Работает НОРМАЛЬНО на локальном сервере разработки asp.net. Соединение с MSSQL Server в порядке (я могу получить любые данные и отобразить их при развертывании веб-сайта)? Никаких исключений не происходит, просто всегда возвращается false ...

Ответы [ 2 ]

0 голосов
/ 17 января 2012

Не используйте GetHashCode для этой цели! Используйте хеши безопасности MD5 или SHA1, которые всегда одинаковы. GetHashCode может возвращать разные значения в разных версиях .NET Framework . Он также возвращает различные значения при использовании в 32-разрядной и 64-разрядной системах.

0 голосов
/ 17 января 2012

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

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

РЕДАКТИРОВАТЬ для ясности:

Я не знаю точно, что GetHashCode это ваша проблема, но я не знаюувидеть что-то еще явно не так.Было бы достаточно легко протестировать: записать ваши хеш-коды в файл журнала, поскольку они все равно являются временными (как вы отметили в комментарии).

И да, GetHashCode может легко измениться при развертывании;например, если вы работаете в другой архитектуре или используете более новую версию Framework, точное значение, возвращаемое из GetHashCode, может определенно отличаться.

...