web-dev-qa-db-fra.com

Adhésion ASP.NET: comment définir l'utilisateur comme connecté

J'essaie de faire fonctionner le fournisseur d'adhésion.

Jusqu'à présent, j'ai:

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

appeler:

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?
    }
}

Si j'entre le login/mot de passe correct, la fonction ValidateUser renvoie true. Ma question est donc la suivante: comment définir l'utilisateur comme étant connecté?

Je teste cela dans mes pages en faisant:

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

J'aurais utilisé les fonctions par défaut, mais cela ne fonctionne tout simplement pas et une recherche sur Google m'a fait penser que je gagnerais du temps en recodant tout cela moi-même.

Tout va aider!

MODIFIER : En ce qui concerne la réponse acceptée, c'est la bonne pour "comment définir l'utilisateur comme connecté" et fonctionne très bien. Cela n'a pas résolu mon problème spécifique mais seulement une partie de celui-ci. Pensé si vous regardez les commentaires, vous trouverez des conseils intéressants.

EDIT 2 et solution: Ok J'ai finalement réussi grâce à tous les commentaires. Voici ce que j'ai fait, c'est plus simple que ce à quoi je m'attendais:

Page qui vérifie l'état de connexion:

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

Se déconnecter:

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

web.config:

<authentication mode="Forms" />

s'identifier:

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

    }
}
29
marcgg

Mettez ceci dans Login1_Authenticate Avant d'appeler Response.Redirect("/admin/default.aspx");

FormsAuthentication.SetAuthCookie("username", true);
38
Gromer

Essayez de déplacer votre code et la suggestion de Gromer vers l'événement 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: Comme l'a dit Gromer, ne faites cela que si vous devez exécuter un code d'entreprise après que l'utilisateur est connecté et avant qu'il ne soit redirigé.

EDIT EDIT: Visual Studio décrit l'événement Authenticate comme "appelé pour authentifier l'utilisateur", ce qui implique que l'utilisateur n'est pas authentifié avant l'appel de l'événement. Ainsi, vous ne pouvez pas confirmer que l'utilisateur est connecté car il/elle n'a pas encore été authentifié.

6
Matthew Jones

Gromer a la réponse, mais vous pouvez également consulter cet article MSDN pour en savoir plus:

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

2
dtc

Bien que je ne sache pas combien d'aide cela sera, c'est du code standard que j'utilise pour discerner entre les utilisateurs administrateurs ou les utilisateurs réguliers. Fonctionne très bien pour moi.

Sur votre page de connexion, probablement cliquez sur créer votre objet utilisateur et appelez une fonction avec ce code (UserRole est un Enum avec vos rôles):

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

Dans votre 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>

... et si vous le voulez vraiment, dans votre page 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
1
Jason