У меня есть приложение MVC 3. В основном это две зоны безопасности. Первый - в основном, чтобы предотвратить публичный доступ, но не очень конфиденциальную информацию. Надежность пароля может быть слабой, так как на самом деле не так уж много вреда.
Вторая зона (Область) ограничена. пользователь должен подать заявку на доступ. Если пользователь получает доступ, он получает определенную роль (и). Таким образом, каждый метод контроллера авторизует пользователя на основе этой роли.
Я хочу, чтобы эти пользователи должны были изменить пароль на надежный пароль при следующем входе в систему, прежде чем они смогут пойти дальше и получить доступ к ограниченному контенту.
Пример:
Пользователь A обращается за доступом.
Доступ предоставлен. Политика паролей для
этот пользователь изменяется, пока у него есть доступ. Они должны
изменить свой пароль при следующем входе в систему, и они не могут изменить обратно
на более слабый пароль, если они играют эту роль.
Есть ли какой-либо безопасный способ реализовать это с помощью ASP.NET?
Обновление
Я на самом деле использовал предложенное Крисом решение, и оно работает, но для проверки самого пароля я также получил некоторое вдохновение от предложенного Михей решения. Однако оказывается, что переопределение MembershipProvider.OnValidatingPassword подразумевает также необходимость реализации 10+ абстрактных методов, которые мне действительно не нужны для решения этой проблемы.
Лучшим решением, на мой взгляд, было присоединение к членству. Я делаю это inn App_Start, затем реализую свою собственную проверку пароля в обработчике событий, и это решило мою проблему.
Просто, чтобы поделиться с вами решением, я представляю его здесь, вместе с Крисом, это решило мою проблему и, надеюсь, и для кого-то еще:
void App_Start()
{
//To do custom validation on certain passwords set new event handler
Membership.ValidatingPassword += Membership_ValidatingPassword;
}
private void Membership_ValidatingPassword(object sender, ValidatePasswordEventArgs e)
{
//If the user is a new user, we let registration happen without strong password
if (e.IsNewUser) return;
MembershipUser membershipUser = Membership.GetUser(e.UserName);
Guid userId = Guid.Parse(membershipUser.ProviderUserKey.ToString());
//First check if the pwd is strong enough to be flagged, if so we flag it
//using regex to validate the password (20 char, 2 uppercase so on)
if (MyValidationClass.IsStrongPassword(e.Password, 20, 2, 4, 1))
{
//if the user does not already have a flag we set one
MyValidationClass.SetStrongPasswordFlag(userId);
}
else
{
//If the user needs strong pwd, we cancel the operation and throw exception
if (MyValidationClass.NeedsStrongPassword(e.UserName))
{
e.FailureInformation =
new MembershipPasswordException("Password does not satisfy reqirements!");
e.Cancel = true;
}
else
{
MyValidationClass.RemoveStrongPasswordFlag(userId);
}
}
}