Членство в ASP.NET: как настроить пользователя как вошедшего в систему - PullRequest
29 голосов
/ 26 мая 2009

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

Пока у меня есть:

 <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");

    }
}

Ответы [ 4 ]

37 голосов
/ 26 мая 2009

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

FormsAuthentication.SetAuthCookie("username", true);
6 голосов
/ 26 мая 2009

Попробуйте переместить ваш код и предложение Громера в событие 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");
        }

    }

РЕДАКТИРОВАТЬ: Как сказал Громер, делайте это только в том случае, если вам нужно выполнить какой-либо бизнес-код после того, как пользователь вошел в систему и до того, как он / она перенаправлен.

РЕДАКТИРОВАНИЕ РЕДАКТИРОВАНИЕ: Visual Studio описывает событие Authenticate как «вызванное для аутентификации пользователя», что означает, что пользователь не прошел аутентификацию до вызова события. Таким образом, вы не можете подтвердить, что пользователь вошел в систему, потому что он еще не прошел аутентификацию.

2 голосов
/ 26 мая 2009

У Громера есть ответ, но вы также можете взглянуть на эту статью MSDN, чтобы узнать больше:

http://msdn.microsoft.com/en-us/library/ms998347.aspx

1 голос
/ 27 мая 2009

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

На странице входа в систему, вероятно, онкликом создайте объект пользователя и вызовите некоторую функцию с этим кодом (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
...