Как разблокировать учетную запись пользователя ASPNETDB после блокировки неверного пароля? - PullRequest
6 голосов
/ 21 июня 2010

Я новичок и использую элемент управления входом в сгенерированную базу данных пользователей ASPNETDB visual studio

Я установил максимальное количество неверных паролей в файле web.config, равное 5, и проверил, что учетная запись заблокирована,Однако я не могу понять, как разблокировать учетную запись сейчас.

эта проблема на моем удаленно размещенном сайте, поэтому я не могу это сделать с помощью инструмента настройки visual studio asp.net

некоторый код на c #, который я мог бы запустить в .cs page_load, который позволил бы мне ввести имя пользователя и разблокировать его, было бы здорово.тогда я мог бы сделать форму, чтобы сделать это позже, когда мне нужно будет легко.

заранее спасибо за любую помощь.

Ответы [ 5 ]

12 голосов
/ 25 октября 2011
  MembershipUser usr = Membership.GetUser(userName);
  usr.UnlockUser();
8 голосов
/ 21 июня 2010

Вручную, в базе данных, перейдите к таблице aspnet_membership, установите FailedLoginPasswordAttemptCount (что-то с таким же именем) на ноль и установите IsLockedOut на 0 (false).

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

HTH.

1 голос
/ 25 марта 2011

У меня есть действительно старый (некрасивый) код из приложения, которое я создал несколько лет назад. Это в значительной степени хак для элемента управления gridview, который использует хранимый процесс aspnet_Membership_UnlockUser в качестве команды удаления с ключом, установленным как имя пользователя заблокированного пользователя в gridrow. Я даже не использовал C #. Вот что у меня есть:

<asp:Label runat="server" ID="LblLockedUsers" Text="Locked Out Users:" />

<asp:SqlDataSource ID="SqlLockedUsers" runat="server" ConnectionString='<%$ ConnectionStrings:myConnString %>'
SelectCommand="selLockedOutUsers" SelectCommandType="StoredProcedure" DeleteCommand="aspnet_Membership_UnlockUser"
DeleteCommandType="StoredProcedure" />

<asp:GridView ID="GvLockedUsers" runat="server" AllowPaging="True" PageSize="5" AutoGenerateColumns="False"
DataKeyNames="UserName" DataSourceID="SqlLockedUsers" AllowSorting="True" GridLines="None"
Width="100%">
  <Columns>
    <asp:TemplateField>
      <ItemTemplate>
        <asp:LinkButton ID="LnkUnlock" CommandArgument='<%# Eval("UserName") %>' CommandName="Delete" runat="server">Unlock</asp:LinkButton>
      </ItemTemplate>
    </asp:TemplateField>
    <asp:BoundField DataField="UserName" HeaderText="User Name" ReadOnly="True" SortExpression="UserName" />
    <asp:CheckBoxField DataField="IsLockedOut" HeaderText="Locked Out" ReadOnly="True" SortExpression="IsLockedOut" />
    <asp:BoundField DataField="LastLockoutDate" HeaderText="Last Lockout" SortExpression="LastLockoutDate" ReadOnly="True" />
    <asp:BoundField DataField="failedPasswordAttemptCount" HeaderText="Failed Password Attempts" SortExpression="failedPasswordAttemptCount" ReadOnly="True" />
  </Columns>
  <EmptyDataTemplate>
    No users are locked out at this time.
  </EmptyDataTemplate>
</asp:GridView>

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

CREATE PROCEDURE [dbo].[selLockedOutUsers]

AS

SELECT 
m.ApplicationId as applicationId,
a.ApplicationName as applicationName,
m.UserId as userId,
u.UserName as UserName,
m.IsLockedOut as isLockedOut,
m.LastLoginDate as lastLoginDate,
m.LastLockoutDate as lastLockoutDate,
m.FailedPasswordAttemptCount as failedPasswordAttemptCount

FROM 
aspnet_Membership m 
JOIN aspnet_Users u ON m.UserId = u.UserId
JOIN aspnet_Applications a ON m.ApplicationId = a.ApplicationId

WHERE 
m.IsLockedOut = '1'

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

ALTER PROCEDURE [dbo].[aspnet_Membership_UnlockUser]
    --@ApplicationName                         nvarchar(256), --replaced with '/'
    @UserName                                nvarchar(256)
AS
BEGIN
    DECLARE @UserId uniqueidentifier
    SELECT  @UserId = NULL
    SELECT  @UserId = u.UserId
    FROM    dbo.aspnet_Users u, dbo.aspnet_Applications a, dbo.aspnet_Membership m
    WHERE   LoweredUserName = LOWER(@UserName) AND
            u.ApplicationId = a.ApplicationId  AND
            LOWER('/') = a.LoweredApplicationName AND
            u.UserId = m.UserId

    IF ( @UserId IS NULL )
        RETURN 1

    UPDATE dbo.aspnet_Membership
    SET IsLockedOut = 0,
        FailedPasswordAttemptCount = 0,
        FailedPasswordAttemptWindowStart = CONVERT( datetime, '17540101', 112 ),
        FailedPasswordAnswerAttemptCount = 0,
        FailedPasswordAnswerAttemptWindowStart = CONVERT( datetime, '17540101', 112 ),
        LastLockoutDate = CONVERT( datetime, '17540101', 112 )
    WHERE @UserId = UserId

    RETURN 0
END
1 голос
/ 21 июня 2010

Вы пытались изменить Web.config, чтобы продлить время блокировки на «больше попыток» или что-то в этом роде? Может быть, это позволит вам таким образом.

Я бы не знал для вас никакого кода CSharp, но я использую инструмент Контроль качества для члена управления данными , где я могу управлять членством (включая статус блокировки) через веб-форму. *

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

0 голосов
/ 21 июня 2010

Этот учебник может помочь, вам, возможно, придется быстро пройти серию:

Разблокировка и подтверждение учетных записей пользователей

...