Pergunta

Eu tive que criar um provedor de associação personalizado para o meu projeto atual ASP .Net, a fim de encaixar com o nosso esquema de banco de dados, e estou tendo problemas configurá-lo para bloquear um usuário se obter a sua senha errada por três vezes, como é suportado pelos fornecedores padrão.

Isto é algo que eu preciso para implementar a mim mesmo, ou deveria ser apoiada inerentemente?

Eu não tenho nenhum código que trata especificamente com ele (e nenhum da interface membros parecem lidar com isso especificamente), mas se eu preciso para implementá-lo eu mesmo, como eu faço para informar o usuário que eles estão bloqueados? Eu preciso levantar algum tipo de exceção em ValidateUser?

Solução

A vergonha Eu não pode marcar duas respostas, os links fornecidos por Dave R dar um grande olhar em profundidade como funciona a adesão, e que Zhaph apontou era exatamente o que eu acabei fazendo, a manipulação da lógica bloqueado no costume filiação provedor.

Eu, então, lidou com a condição de erro usando evento LoginError do controle Login e check-in lá para ver se o usuário foi bloqueado, a fim de mostrar a mensagem de erro apropriada.

Foi útil?

Solução

Scott Mitchell escreveu uma excelente série de tutoriais no site do ASP.NET. Este link inclui informações sobre como criar um provedor personalizado e discute a lógica de bloqueio:

http://www.asp.net/LEARN/security/ tutorial-06-cs.aspx

Não há também nenhum método embutido para contas de desbloqueio (ou seja, você tem que fazer isso através de ferramentas de banco de dados se você estiver usando algo parecido com o SqlMembershipProvider). Scott também escreveu um artigo sobre a criação de uma interface de usuário para gerenciar isso, o que você pode encontrar aqui:

http://www.asp.net/LEARN/security/ tutorial-14-vb.aspx

Na verdade, eu recomendo a leitura de toda a série. Scott é um excelente comunicador.

Espero que isso ajude.

Outras dicas

Isso é algo que você tem que escrever-se.

O esquema de banco de dados padrão tem as seguintes colunas na tabela aspnet_Membership:

IsLockedOut
FailedPasswordAttemptCount
FailedPasswordAttemptWindowStart

A contagem tentativa será incrementado em cada tentativa fracassada dentro da janela de tentativa, e o tempo da primeira tentativa falhou é armazenado na coluna janela de início, uma vez FailedPasswordAttemptCount iguala os maxInvalidPasswordAttempts da configuração, o IsLockedOut está definido.

Como Michiel estados, o seu método ValidateUser seguida, terá de verificar esses valores com base nas configurações na configuração do provedor - por padrão estes são:

maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"

Uma vez que o usuário teve as tentativas máximo de login, você vai precisar para assegurar que você tenha definido a MembershipUser.IsLockedOut é definido a partir de seu provedor - você pode então verificar esse valor e se comportar adequadamente - se você estiver usando o login padrão controles, este valor será provavelmente já ser verificado para você.

Replicar as condições que levam ao bloqueio (muitas tentativas de login errados). Porque provedores de associação fazer uma viagem para o seu back-end de cada vez, é sensato limitar essa abordagem para fornecedores com número razoável de MaxInvalidPasswordAttempts.

if (0 < Membership.MaxInvalidPasswordAttempts && Membership.MaxInvalidPasswordAttempts < 100)
       {
                for(int i = 0; i <= Membership.MaxInvalidPasswordAttempts; i++)
                {
                    Membership.ValidateUser(userName, "jfdlsjflksjlkfjsdlkfjsdl");
                }
        }

Em seu provedor de associação personalizado, você deve implementar a função ValidateUser. Lá você não só verificar se o nome de usuário ea senha são válidos, mas você também recuperar o número de tentativas inválidas de senha etc do seu armazenamento de dados. Se o nome de usuário / senha é válido, redefinir a contagem de tentativa de senha, otherelse aumentar a contagem de tentativa. O SqlMembershipProvider também armazena a data e hora LastAttempt, então você não pode Bruteforce você maneira, porque você não tem permissão para tentar dentro de um determinado período de tempo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top