19/07/11

Form Authentication - utilizzare un custom provider sql

Utilizzando la form authentication in asp.net è possibile sfruttare il provider AspNetSqlProfileProvider per gestire gli accessi al sito,creare un nuovo utente, modificare la password e molto altro, senza la necessità di scrivere righe di codice.

Tramite questo provider però è necessario creare un database ad hoc utilizzando il comando Aspnet_regsql nel quale in automatico verranno create le tabelle,store procedure e tutto quanto è indispensabile per fare funzionare correttamente l'autenticazione.

Supponiamo invece di volere utilizzare una tabella utenti presente nel nostro database, creeremo quindi un provider personalizzato secondo le nostre esigenze.

Nel caso specifico abbiamo utilizzato ADO.NET per effettuare le query sul db, questo perchè la nostra esigenza era quella di realizzare un piccolo programma, ovviamente potete decidere di utilizzare un ORM come Entity Framework, NHibernate e così via...

I passi da fare sono:

- Creazione tabella utenti

CREATE TABLE [Users] (    
   [username] [varchar] (15) NOT NULL ,
   [password] [varchar] (25) NOT NULL ,
   [userRole] [tinyint]  NOT NULL , 
) ON [PRIMARY]
GO 
ALTER TABLE [dbo].[Users] WITH NOCHECK ADD
   CONSTRAINT [PK_Users] PRIMARY KEY  NONCLUSTERED     
   (       
      [username]    
   )  ON [PRIMARY]  
GO  

- Creazione di un provider
Il provider è una classe che deriva da MembershipProvider e nella quale andremo ad implementare i metodi che ci interessano per la validazione

Nell'esempio abbiamo implementato solo il metodo ValidateUser che permette di effettuare il login al sito.

using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Web.Security;

namespace MpsManager.Controllers.Helper
{
    public class CustomSqlValidatorProvider : MembershipProvider
    {
        public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
        {
            throw new System.NotImplementedException();
        }

        public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
        {
            throw new System.NotImplementedException();
        }

        public override string GetPassword(string username, string answer)
        {
            throw new System.NotImplementedException();
        }

        public override bool ChangePassword(string username, string oldPassword, string newPassword)
        {
            throw new System.NotImplementedException();
        }

        public override string ResetPassword(string username, string answer)
        {
            throw new System.NotImplementedException();
        }

        public override void UpdateUser(MembershipUser user)
        {
            throw new System.NotImplementedException();
        }

        public override bool ValidateUser(string username, string password)
        {
            IList list = new List();
            list.Add(new SqlParameter("UserName",username));
            list.Add(new SqlParameter("Password", password));
            var status =  SQLADOHelper.ExecuteScalarQueryCommand("Select 1 from Users where userName=@UserName and password=@password",list);
            return status != null;
        }

        public override bool UnlockUser(string userName)
        {
            throw new System.NotImplementedException();
        }

        public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
        {
            throw new System.NotImplementedException();
        }

        public override MembershipUser GetUser(string username, bool userIsOnline)
        {
            throw new System.NotImplementedException();
        }

        public override string GetUserNameByEmail(string email)
        {
            throw new System.NotImplementedException();
        }

        public override bool DeleteUser(string username, bool deleteAllRelatedData)
        {
            throw new System.NotImplementedException();
        }

        public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
        {
            throw new System.NotImplementedException();
        }

        public override int GetNumberOfUsersOnline()
        {
            throw new System.NotImplementedException();
        }

        public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
        {
            throw new System.NotImplementedException();
        }

        public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
        {
            throw new System.NotImplementedException();
        }

        public override bool EnablePasswordRetrieval
        {
            get { throw new System.NotImplementedException(); }
        }

        public override bool EnablePasswordReset
        {
            get { throw new System.NotImplementedException(); }
        }

        public override bool RequiresQuestionAndAnswer
        {
            get { throw new System.NotImplementedException(); }
        }

        public override string ApplicationName
        {
            get { throw new System.NotImplementedException(); }
            set { throw new System.NotImplementedException(); }
        }

        public override int MaxInvalidPasswordAttempts
        {
            get { throw new System.NotImplementedException(); }
        }

        public override int PasswordAttemptWindow
        {
            get { throw new System.NotImplementedException(); }
        }

        public override bool RequiresUniqueEmail
        {
            get { throw new System.NotImplementedException(); }
        }

        public override MembershipPasswordFormat PasswordFormat
        {
            get { throw new System.NotImplementedException(); }
        }

        public override int MinRequiredPasswordLength
        {
            get { throw new System.NotImplementedException(); }
        }

        public override int MinRequiredNonAlphanumericCharacters
        {
            get { throw new System.NotImplementedException(); }
        }

        public override string PasswordStrengthRegularExpression
        {
            get { throw new System.NotImplementedException(); }
        }
    }
}

- modifichiamo il file web.config per aggiungere il nostro provider e attivare l'autenticazione specificando quale sarà la pagina che si occuperà del login.


      
    

    
      
        
        
      
    


- Creiamo la view con i nostri campi di accesso (se utilizzate asp.net MVC la View ed il controller conterranno il codice che ci serve)

View
    

Accesso al sistema

<% using (Html.BeginForm()) { %> <%: Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again.") %>
Informazioni account
<%: Html.LabelFor(m => m.UserName) %>
<%: Html.TextBoxFor(m => m.UserName) %> <%: Html.ValidationMessageFor(m => m.UserName) %>
<%: Html.LabelFor(m => m.Password) %>
<%: Html.PasswordFor(m => m.Password) %> <%: Html.ValidationMessageFor(m => m.Password) %>

<% } %>

Controller
 [HttpPost]
        public ActionResult LogOn(LogOnModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (Membership.ValidateUser(model.UserName, model.Password))
                {
                    FormsAuthentication.SetAuthCookie(model.UserName, false);
                    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                        && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    ModelState.AddModelError("", "The user name or password provided is incorrect.");
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

0 commenti:

Posta un commento

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Grants For Single Moms