Подтвердить что ты не робот

Членство в ASP.NET: как установить пользователя в качестве входа в систему

Я пытаюсь заставить Провайдера членства работать.

До сих пор я:

 <asp:Login ID="Login1" runat="server" OnAuthenticate="Login1_Authenticate">
 </asp:Login>

вызов:

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
    if(Membership.ValidateUser(Login1.UserName, Login1.Password))
    {
        Response.Redirect("/admin/default.aspx");
        // Set the user as logged in?
    }
}

Если я ввешу правильный логин/пароль, функция ValidateUser вернет true. Поэтому мой вопрос: как я могу установить пользователя во вход?

Я тестирую это на своих страницах:

protected void Page_Load(object sender, EventArgs e)
{
    if ( Membership.GetUser()==null)
    {
        Response.Redirect("/admin/login.aspx");
    }
    // else "you are logged in, congratulations"                
}

Я бы использовал функции по умолчанию, но он просто не работает, и поиск в Google заставил меня думать, что я сэкономлю время, фактически перекодируя все это.

Все, что поможет!

РЕДАКТИРОВАТЬ. Что касается принятого ответа, то он правильный для "того, как установить пользователя во время входа в систему" ​​и работает нормально. Это не определило мою конкретную проблему, а только ее часть. Мысль, если вы посмотрите на комментарии, вы найдете интересные указатели.

ИЗМЕНИТЬ 2 и решение: Хорошо, я наконец-то отработал это благодаря всем комментариям. Вот что я сделал, это проще, чем я ожидал:

Страница, которая проверяет состояние входа:

 protected void Page_Load(object sender, EventArgs e)
 {
     if ( !Request.IsAuthenticated)
     {
         Response.Redirect("/admin/login.aspx");
     }  

Выход:

   protected void LoginStatus1_Logout(object sender, LoginCancelEventArgs e)
   {
       FormsAuthentication.SignOut();
       Response.Redirect("/admin/login.aspx");
   }
}

web.config:

<authentication mode="Forms" />

Логин:

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
    if(Membership.ValidateUser(Login1.UserName, Login1.Password))
    {
        FormsAuthentication.SetAuthCookie(Login1.UserName, true);
        Response.Redirect("/admin/default.aspx");

    }
}
4b9b3361

Ответ 1

Поместите это в Login1_Authenticate перед вызовом Response.Redirect("/admin/default.aspx");

FormsAuthentication.SetAuthCookie("username", true);

Ответ 2

Попробуйте переместить код и предложение Gromer в событие LoggedIn.

protected void Login1_LoggedIn(object sender, EventArgs e)
    {
        if(Membership.ValidateUser(Login1.UserName, Login1.Password))
        {
            FormsAuthentication.SetAuthCookie(Login1.UserName, true);
            Response.Redirect("/admin/default.aspx");
        }

    }

EDIT: Как сказал Громер, сделайте это только в том случае, если вам нужно выполнить какой-либо бизнес-код после входа пользователя в систему и перед его/ее перенаправлением.

EDIT EDIT: Visual Studio описывает событие Authenticate как "вызываемое для аутентификации пользователя", что подразумевает, что пользователь не аутентифицирован до вызова события. Таким образом, вы не можете подтвердить, что пользователь зарегистрирован, потому что он еще не прошел проверку подлинности.

Ответ 4

Пока я не знаю, насколько это поможет, это шаблонный код, который я использую, чтобы различать пользователей admin или обычных пользователей. Отлично работает для меня.

На вашей странице входа, возможно, onclick создайте свой пользовательский объект и вызовите некоторую функцию с помощью этого кода (UserRole - это Enum с вашими ролями):

If admin Then 
            If role = UserRole.Admin Then
                RedirectFromLoginPage(username & "|" & userid, False)
                Return True
            Else
                Return False
            End If
        Else
            If String.IsNullOrEmpty(Current.Request.QueryString("ReturnUrl")) Then
                SetAuthCookie(username & "|" & userid, True)
            Else
                RedirectFromLoginPage(username & "|" & userid, True)
            End If
            Return True
        End If

В вашем web.config:

<location path="admin">
    <system.web>
        <authorization>
            <allow roles="Admin"/>
            <deny users="*"/>
        </authorization>
    </system.web>
</location>
.....
<system.web>
<authentication mode="Forms">
        <forms loginUrl="/registration/login.aspx" timeout="129600"/>
    </authentication>
    <authorization>
        <allow users="*"/>
    </authorization>
</system.web>

... и если вы действительно хотите, на странице Global.asax:

    Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
    If Request.IsAuthenticated Then
''
'get your roles for the current user'
''
 Dim userRoles() As String = Split(roles, "|")
        'Add the roles to the User Principal'
        HttpContext.Current.User = New GenericPrincipal(User.Identity, userRoles)
    End If
End Sub