Требовать более надежный пароль для некоторых пользователей в зависимости от ролей - PullRequest
4 голосов
/ 23 февраля 2012

У меня есть приложение 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);
            }
        }
    }

Ответы [ 3 ]

2 голосов
/ 23 февраля 2012

Вы можете написать свой собственный атрибут авторизации, чтобы приспособить оба. Вам просто нужно использовать его в соответствующих разделах вашего приложения:

Например:

public class HasChangedPasswordAttribute : AuthorizeAttribute
{      
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        UserRepository repo = new UserRepository();
        var user = repo.GetCurrentUser();
        bool hasSecurelyChangedPassword = user.HasSecurelyChangedPassword;
        return hasSecurelyChangedPassword;
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectResult("/Account/ChangePassword");
    }
}

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

Затем вы можете использовать его так:

[HasChangedPassword]
[Authorize(Roles="SuperRole")]
public ActionResult MySecureAction()
{
 ...
}

Очевидно, что вы можете объединить оба эти атрибута в один, но для показа примера они разделены выше.

1 голос
/ 23 февраля 2012

вам потребуется переопределить пароль MembershipProvider.OnValidatingPassword

http://msdn.microsoft.com/en-us/library/system.web.security.membershipprovider.onvalidatingpassword.aspx

0 голосов
/ 23 февраля 2012

Вероятно, более простым способом будет проверка надежности пароля на стороне клиента, когда пользователь пытается ввести новый пароль.Посмотрите этот список для некоторых примеров использования JQuery.

Что касается транзакции обновления и сброса пароля, это то, что может обрабатывать ваш код, то есть флаг в таблице пользователей, который перенаправляетпользователь на новую страницу регистрации.Но когда они устанавливают пароль (и, предположительно, он соответствует надлежащей надежности), его можно отправить ...

...