|
|
jan
22
2007
|
ASP.net : comment restreindre l’accès à toutes les pages de votre site Ecommerce |
|
|
|
Programmation -
ASP/.Net/PHP
|
|
Ecrit par Kamal AOUDA
|
|
22-01-2007 |
|
ASP.net : comment restreindre l’accès à toutes les pages de votre site Ecommerce
ASP.net : comment restreindre
l’accès à toutes les pages de votre site Ecommerce
Dans ce qui suit nous expliquerons comment il faut procéder pour limiter l’accès
à vos pages ASP.net à un groupe restreint d’utilisateurs préalablement
autorisés.
Tout d’abord vous devez modifier le fichier web.config de manière à ce
que l’authentification se fasse en mode Forms. Ensuite il faut créer une
page d’authentification .aspx pour permettre à l’utilisateur de
renseigner ses paramètres d’authentification.
Modifiez votre fichier web.config de la manière suivante :
A. Ouvrir votre fichier web.config à l’aide de votre éditeur préféré.
B. Attribuez la valeur Forms à l’attribut <authentication>, ligne
3 de l’exemple.
C.Créez un nouvel élément <forms> comme dans l’exemple suivant, ligne 5 à
16
1. <! L’authentification doit se faire en mode Forms>
2.
3. <authentication mode="Forms">
4.
5. <forms name=".EcommerceDEVAuthentificationPattern"
6.
7. loginUrl="Login.aspx"
8.
9. protection="All"
10.
11. timeout="30"
12.
13. path="/">
14.
15. </forms>
16. </authentication>
D. Ajouter des tags <deny> et <allow> sous le tag <authorization>
pour interdire l’accès aux utilisateurs anonymes et autoriser seulement ceux
qui se sont authentifiés.
1. <authorization>
2. <deny users="?" /> <!—Refuser tous les utilisateurs anonymes -->
3. <allow users="*" /> <!—Accepter tous les utilisateurs qui se sont
authentifiés -->
4. </authorization>
Commentaires :
* name: il s’agit du nom du cookie HTTP utilisé par ASP.net en vue de
conserver l’ID et le mot de passe de l’utilisateur. Le nom attribué au cookie
doit être unique sinon il pourrait y avoir des problèmes d’authentification (le
problème du cross authentifcation se produit lorsque deux applications
utilisent des cookies portant le même nom).
* loginUrl: contient l’adresse de la page vers laquelle les utilisateurs
seront redirigés s’ils essaient d’accéder à votre site sans s’être préalablement
authentifiés. Dans notre cas, la redirection se fait vers la page de login.
* protection: spécifie le niveau de protection du cookie. Cette variable
peut prendre l’une ou l’autre des trois valeurs suivantes: 1) Validation :
signifie que les données conservées dans le cookie doivent être validées
afin de vérifier si elles n’ont pas été altérées pendant le transit entre le
client et le serveur. 2) Encryption : signifie que le contenu du cookie
sera encrypté. 3) All : signifie que le contenu du cookie sera à la fois
validé et encrypté. C’est cette troisième valeur que nous vous recommandons
d’utiliser car elle offre le plus haut niveau de sécurité.
* timeout: indique en nombre de minutes la durée au delà de laquelle le
cookie expirera. La durée de vie de vos cookies doit être au moins identique à
celle de votre session courante. En d’autres termes le cookie doit avoir au
moins le même timeout que la session. Si vous donnez au cookie un
timeout inférieur à celui de la session vos utilisateurs seront redirigés
vers la page de login même si la session n’a pas encore expirée.
* path: indique le chemin vers le répertoire où les cookies sont
conservés. Nous vous recommandons de laisser cette variable vide en lui
attribuant la valeur “/”
E. Créez maintenant votre page de login .aspx en respectant certaines
règles de base :
- Votre page de login doit contenir au moins un champ ID et un champ mot de
passe. Vous pouvez à votre convenance ajouter tous les autres champs que vous
souhaitez.
- Ajouter à votre formulaire un bouton de login.
- Au besoin ajouter un checkbox pour permettre à l’application de
reconnaître l’utilisateur à chaque fois qu’il se reconnecte au site. Ceci lui
évitera de saisir à chaque fois son ID et son mot de passe.
F. Dans la partie code (code behind) de votre page ASP.net utilisez votre
langage de programmation préféré pour:
* Vérifier que le mot de passe et l’ID saisis par l’utilisateur correspondent à
ceux stockés dans la base de données de votre site.
* Si l’ID et le mot de passe sont valides, créer un Forms authentication
cookie et ajouter le à la collection de cookies retournés par le navigateur en
appelant la méthode SetAuthCookie de la classe FormsAuthentication
(consultez l’exemple donné à la fin de cet article pour plus de précisions à ce
sujet). Parce que la méthode SetAuthCookie est statique vous n’avez
pas besoin d’instancier la classe FormAuthentication.
* Rendre le Forms authentication cookie persistant sur la machine du
client.
* Redirigez l’utilisateur vers la page d’accueil de votre application ou encore
vers la page à laquelle l’utilisateur a voulu accéder avant de s’authentifier.
ASP.net conserve automatiquement l’adresse de cette dernière page. Le code
source reproduit à la fin de cet article vous montre comment la récupérer en vue
d’effectuer la redirection.
Il est important de noter qu'ASP.net restreint l’accès uniquement aux fichiers
associés à la DLL ASP.NET ISAPI. Par défaut les extensions de fichiers
associées à cette DLL sont : asax, .ascx, .ashx, .asmx, .aspx, .axd, .vsdisco,
.rem, .soap, .config, .cs, .csproj, .vb, .vbproj, .webinfo, .licx, .resx. Les
fichiers qui ont une autre extension (.gif, .jpg, .txt, .js…) ne sont pas
protégés. Pour les protéger, il vous suffit de les ajouter à la liste des
fichiers associés à la DLL ASP.NET ISAPI (consultez le fichier d’aide d’IIS
pour plus d’informations à ce sujet). Avant d’ajouter ces fichiers il faut
savoir que les performances globales de votre application pourraient se
dégrader.
Nous reproduisons ci-dessous le code source duquel vous pouvez vous inspirer
pour créer votre application.
CODE SOURCE, PAGE DE LOGIN .aspx:
<%@ Page Language="vb" AutoEventWireup="false"
Codebehind="Login.aspx.vb"
Inherits="EcommerceDEV.VBSecurity.Login"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Login</title>
<link rel="stylesheet" href="css/nomdevotrecss.css">
</head>
<body leftmargin="0" marginheight="0" marginwidth="0" topmargin="0">
<form id="frmSecurity" method="post" runat="server">
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td align="center">
<img src="images/imagepourembellirlapge.gif">
</td>
</tr>
<tr>
<td class="dividerLine">
<img src="images/imagepourcreerunespace.gif" height="6" border="0"></td>
</tr>
</table>
<table width="90%" align="center" border="0">
<tr>
<td><img src="images/ imagepourcreerunespace.gif" height="10" border="0"></td>
</tr>
<tr>
<td align="center" class="PageHeading">
Block Access To All Pages (VB)
</td>
</tr>
<tr>
<td><img src="images/ imagepourcreerunespace.gif " height="10" border="0"></td>
</tr>
<tr><td align="center">
<table>
<tr>
<td class="LabelText">Login ID: </td>
<td>
<asp:TextBox ID="txtLoginID" Runat="server"
CssClass="LabelText" />
</td>
</tr>
<tr>
<td class="LabelText">Password: </td>
<td>
<asp:TextBox ID="txtPassword" Runat="server"
CssClass="LabelText" TextMode="Password" />
</td></tr><tr><td colspan="2" align="center"><asp:CheckBox ID="chkRememberMe" Runat="server"
CssClass="LabelText" Text="Remember Me" /></td>
</tr><tr><td colspan="2" align="center"><br /><input id="btnLogin" runat="server"
type="button" value="Login" />
</td>
</tr>
<tr>
<td colspan="2" align="center">
<br />
<input type="button" value="Attempt Access without Login"
onclick="document.location='Home.aspx'" />
</td>
</tr>
</table>
</td>
</tr>
</table>
</form>
</body>
</html>
CODE SOURCE, code-behind (.vb)
Option Explicit On
Option Strict On
'-----------------------------------------------------------------------------
'
' Module Name: Login.aspx.vb
'
' Description: This module provides the code behind for the
' Login.aspx page
'
'*****************************************************************************
Imports Microsoft.VisualBasic
Imports System.Configuration
Imports System.Data
Imports System.Data.OleDb
Imports System.Web.Security
Imports System.Web.UI.HtmlControls
Imports System.Web.UI.WebControls
Namespace EcommerceDEV.VBSecurity.Login
Public Class Login
Inherits System.Web.UI.Page
'controls on the form
Protected txtLoginID As TextBox
Protected txtPassword As TextBox
Protected chkRememberMe As CheckBox
Protected WithEvents btnLogin As HtmlInputButton
'*************************************************************************
'
' ROUTINE: Page_Load
'
' DESCRIPTION: This routine provides the event handler for the page load
' event. It is responsible for initializing the controls
' on the page.
'-------------------------------------------------------------------------
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles MyBase.Load
'Put user code to initialize the page here
End Sub 'Page_Load
'*************************************************************************
'
' ROUTINE: btnLogin_ServerClick
'
' DESCRIPTION: This routine provides the event handler for the login
' button click event. It is responsible for authenticating
' the user and redirecting to the next page if the user
' is authenticated.
'-------------------------------------------------------------------------
Private Sub btnLogin_ServerClick(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnLogin.ServerClick
'name of querystring parameter containing return URL
Const QS_RETURN_URL As String = "ReturnURL"
Dim dbConn As OleDbConnection
Dim dCmd As OleDbCommand
Dim dr As OleDbDataReader
Dim strConnection As String
Dim strSQL As String
Dim nextPage As String
Try
'get the connection string from web.config and open a connection
'to the database
strConnection = _
ConfigurationSettings.AppSettings("dbConnectionString")
dbConn = New OleDb.OleDbConnection(strConnection)
dbConn.Open( )
'check to see if the user exists in the database
strSQL = "SELECT (FirstName + ' ' + LastName) AS UserName " & _
"FROM AppUser " & _
"WHERE LoginID=? AND " & _
"Password=?"
dCmd = New OleDbCommand(strSQL, dbConn)
dCmd.Parameters.Add(New OleDbParameter("LoginID",
_txtLoginID.Text))
dCmd.Parameters.Add(New OleDbParameter("Password", _
txtPassword.Text))
dr = dCmd.ExecuteReader( )
If (dr.Read( )) Then
'user credentials were found in the database so notify the system
'that the user is authenticated
FormsAuthentication.SetAuthCookie(CStr(dr.Item("UserName")), _
chkRememberMe.Checked)
'get the next page for the user
If (Not IsNothing(Request.QueryString(QS_RETURN_URL))) Then
'user attempted to access a page without logging in so redirect
'them to their originally requested page
nextPage = Request.QueryString(QS_RETURN_URL)
Else
'user came straight to the login page so just send them to the
'home page
nextPage = "Home.aspx"
End If
'Redirect user to the next page
'NOTE: This must be a Response.Redirect to write the cookie to the
' user's browser. Do NOT change to Server.Transfer which
' does not cause around trip to the client browser and thus
' will not write the authentication cookie to the client
' browser.
Response.Redirect(nextPage, True)
Else
'user credentials do not exist in the database - in a production
'application this should output an error message telling the user
'that the login ID or password was incorrect
End If
Finally
'cleanup
If (Not IsNothing(dr)) Then
dr.Close( )
End If
If (Not IsNothing(dbConn)) Then
dbConn.Close( )
End If
End Try
End Sub 'btnLogin_ServerClick
End Class 'Login
End Namespace
CODE SOURCE, code-behind (.cs)
//----------------------------------------------------------------------------
// Module Name: Login.aspx.cs
// Description: This module provides the code behind for the
// Login.aspx page
//****************************************************************************
using System;
using System.Configuration;
using System.Data;
using System.Data.OleDb;
using System.Web.Security;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace EcommerceDEV.VBSecurity.Login
{
public class Login : System.Web.UI.Page
{
// controls on the form
protected System.Web.UI.WebControls.TextBox txtLoginID;
protected System.Web.UI.WebControls.TextBox txtPassword;
protected System.Web.UI.WebControls.CheckBox chkRememberMe;
protected System.Web.UI.HtmlControls.HtmlInputButton btnLogin;
//************************************************************************
//
// ROUTINE: Page_Load
//
// DESCRIPTION: This routine provides the event handler for the page
// load event. It is responsible for initializing the
// controls on the page.
//------------------------------------------------------------------------
private void Page_Load(object sender, System.EventArgs e)
{
// wire the login button
this.btnLogin.ServerClick += new EventHandler(this.btnLogin_ServerClick);
} // Page_Load
//************************************************************************
//
// ROUTINE: btnLogin_ServerClick
//
// DESCRIPTION: This routine provides the event handler for the login
// button click event. It is responsible for
// authenticating the user and redirecting to the next
// page if the user is authenticated.
//
//------------------------------------------------------------------------
private void btnLogin_ServerClick(Object sender,
System.EventArgs e)
{
// name of querystring parameter containing return URL
const String QS_RETURN_URL = "ReturnURL";
OleDbConnection dbConn = null;
OleDbCommand dCmd = null;
OleDbDataReader dr = null;
String strConnection = null;
String strSQL = null;
String nextPage = null;
try
{
// get the connection string from web.config and open a connection
// to the database
strConnection =
ConfigurationSettings.AppSettings["dbConnectionString"];
dbConn = new OleDbConnection(strConnection);
dbConn.Open( );
// check to see if the user exists in the database
strSQL = "SELECT (FirstName + ' ' + LastName) AS UserName " +
"FROM AppUser " +
"WHERE LoginID=? AND " +
"Password=?";
dCmd = new OleDbCommand(strSQL, dbConn);
dCmd.Parameters.Add(new OleDbParameter("LoginID",
txtLoginID.Text));
dCmd.Parameters.Add(new OleDbParameter("Password",
txtPassword.Text));
dr = dCmd.ExecuteReader( );
if (dr.Read( ))
{
// user credentials were found in the database so notify the system
// that the user is authenticated
FormsAuthentication.SetAuthCookie((String)(dr["UserName"]),
chkRememberMe.Checked);
// get the next page for the user
if (Request.QueryString[QS_RETURN_URL] != null)
{
// user attempted to access a page without logging in so redirect
// them to their originally requested page
nextPage = Request.QueryString[QS_RETURN_URL];
}
else
{
// user came straight to the login page so just send them to the
// home page
nextPage = "Home.aspx";
}
// Redirect user to the next page
// NOTE: This must be a Response.Redirect to write the cookie to
// the user's browser. Do NOT change to Server.Transfer
// which does not cause around trip to the client browser
// and thus will not write the authentication cookie to the
// client browser.
Response.Redirect(nextPage, true);}
else
{// user credentials do not exist in the database - in a production
//application this should output an error message telling the user
// that the login ID or password was incorrect.}
} // try
finally
{// cleanup
if (dr != null)
{dr.Close( );}
if (dbConn != null)
{dbConn.Close( );}} // finally
} // btnLogin_ServerClick
} // Login
}
Kamal AOUDA
Ecommerce DEV
http://www.kamalaouda.com
|
|
Dernière mise à jour : ( 24-01-2007 )
|
|
Professional Development with Web APIs : Google, eBay, Amazon.com, MapPoint, FedEx |
|
Professional Development with Web APIs : Google, eBay, Amazon.com, MapPoint, FedEx
Un livre idéal pour les programmeurs .Net qui veulent intégrer à
leurs applications de commerce électronique, les fonctionnalités
offertes à travers les services web de Google, Fedex, Ebay, Amazon et
MapPoimt.
Après un bref rappel des concepts de base, ce livre aborde
des sujets avancés comme l'appel des API à partir d'appareils mobiles ou
des applications développées avec VBA, l'envoi d'un fax via l'API Paypal,
la création de votre propre web API (cette liste n'est pas limitative).
A la fin de ce livre vous trouverez des études de cas qui montrent
comment utiliser les API précitées pour développer rapidement une
application CRM et un un tableau de bord électronique.
Références
http://www.wrox.com/WileyCDA/WroxTitle/productCd-0764584456.html, Denise M. Gosnell, Wrox,
ISBN: 0-7645-8445-6,
April 2005,
324 pages
|
|
|