Как разблокировать учетную запись пользователя ASPNETDB после блокировки неверного пароля?
Я новичок и использую контроль входа в систему с помощью пользовательской базы данных ASPNETDB visual studio
я установил максимальное количество неверных паролей 5 в файле web.config и проверил, что учетная запись заблокирована. Однако я не могу понять, как разблокировать учетную запись сейчас.
эта проблема на моем удаленно размещенном сайте, так что я не могу это сделать с помощью инструмента настройки Visual Studio asp.net
какой-то код на C#, который я мог бы запустить в.cs page_load, позволил бы мне ввести имя пользователя и разблокировать его, было бы здорово. тогда я мог бы сделать форму, чтобы сделать это позже, когда мне нужно легко.
Заранее благодарю за любую помощь.
5 ответов
MembershipUser usr = Membership.GetUser(userName);
usr.UnlockUser();
Вручную, в базе данных, перейдите в таблицу aspnet_membership, установите FailedLoginPasswordAttemptCount
(что-то с таким же именем) к нулю и установить IsLockedOut
до 0 (ложь).
Мы создали собственный экран безопасности для управления ими в нескольких моих приложениях, или вы можете использовать компонент, подобный упомянутому в других сообщениях.
НТН.
У меня есть действительно старый (некрасивый) код из приложения, которое я создал несколько лет назад. Это в значительной степени хак для элемента управления 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
Вы пытались изменить Web.config, чтобы продлить время блокировки на "больше попыток" или что-то в этом роде? Может быть, это позволит вам таким образом.
Я бы не знал для вас никакого кода CSharp, но я использую инструмент " Контроль качества", в котором я могу управлять членством (включая состояние блокировки) через веб-форму.
Хотя это не поможет вам прямо сейчас, это должно помочь вам в будущем. Кроме того, как только вы сможете снова войти в систему (после истечения срока действия блокировки), я бы предложил удалить информацию о блокировке из Web.config до тех пор, пока вы не будете готовы начать работу. Обширное тестирование вашего приложения обязательно заблокирует вас снова и снова.
Это руководство может помочь, вам, возможно, придется быстро пройти серию: