Vous êtes sur la page 1sur 37

 

Crypter la chaîne de connexion, le mot de passe


- Système de connexion basé sur le rôle
- Configurez facilement votre connexion à la base de données
- Créez facilement votre application dynamique
Je peux vous donner un correctif Devexpress pour Visual Studio 2017 lors de l’achat
du code source. Il vous aidera à apprendre et à développer facilement votre
application.
Je n’ai pas encore intégré le paiement pour chaque produit sur mon site web. Vous
pouvez acheter des produits en utilisant le bouton Faire un don au-dessus du menu.
Et n’oubliez pas de tanhynh@gmail.com envoyer un e-mail.
Après vérification, je vous enverrai le fichier par e-mail. Merci pour la gêne
occasionnée !
Créer un projet d’application Windows Forms, puis créer un dossier Entités

Ensuite, ouvrez Microsoft SQL Server Management Studio, puis exécutez le script


sql ci-dessous pour créer votre base de données.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[FunctionRoles](
    [FunctionId] [int] NOT NULL,
    [RoleId] [int] NOT NULL,
 CONSTRAINT [PK_FunctionRoles] PRIMARY KEY CLUSTERED
(
    [FunctionId] ASC,
    [RoleId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS
= ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Functions]    Script Date:
9/3/2020 9:19:22 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Functions](
    [FunctionId] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT
NULL,
    [ParentId] [int] NULL,
    [BeginGroup] [bit] NULL,
    [FormName] [nvarchar](255) NULL,
    [FormStyle] [nvarchar](255) NULL,
    [FunctionName] [nvarchar](255) NULL,
    [Image] [varbinary](max) NULL,
    [Menu] [bit] NULL,
    [MethodName] [nvarchar](255) NULL,
    [Order] [int] NULL,
    [Parameter] [nvarchar](255) NULL,
    [RibbonStyle] [bit] NULL,
    [Status] [bit] NULL,
    [Type] [nvarchar](255) NULL,
 CONSTRAINT [PK_Functions] PRIMARY KEY CLUSTERED
(
    [FunctionId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS
= ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Roles]    Script Date: 9/3/2020
9:19:22 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Roles](
    [RoleId] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
    [RoleName] [nvarchar](255) NULL,
 CONSTRAINT [PK_Roles] PRIMARY KEY CLUSTERED
(
    [RoleId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS
= ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[UserRoles]    Script Date:
9/3/2020 9:19:22 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[UserRoles](
    [UserId] [int] NOT NULL,
    [RoleId] [int] NOT NULL,
 CONSTRAINT [PK_UserRoles] PRIMARY KEY CLUSTERED
(
    [UserId] ASC,
    [RoleId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS
= ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Users]    Script Date: 9/3/2020
9:19:22 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Users](
    [UserId] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
    [FullName] [nvarchar](255) NULL,
    [UserName] [nvarchar](50) NOT NULL,
    [Password] [nvarchar](255) NULL,
    [Status] [bit] NULL,
    [DateCreate] [datetime] NULL,
 CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
    [UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS
= ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO
/****** Object:  Index [IX_Users]    Script Date: 9/3/2020
9:19:22 AM ******/
CREATE UNIQUE NONCLUSTERED INDEX [IX_Users] ON [dbo].[Users]
(
    [UserName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING
= OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS
= ON) ON [PRIMARY]
GO
ALTER TABLE [dbo].[FunctionRoles]  WITH CHECK ADD  CONSTRAINT
[FK_FunctionRoles_Functions] FOREIGN KEY([FunctionId])
REFERENCES [dbo].[Functions] ([FunctionId])
GO
ALTER TABLE [dbo].[FunctionRoles] CHECK CONSTRAINT
[FK_FunctionRoles_Functions]
GO
ALTER TABLE [dbo].[FunctionRoles]  WITH CHECK ADD  CONSTRAINT
[FK_FunctionRoles_Roles] FOREIGN KEY([RoleId])
REFERENCES [dbo].[Roles] ([RoleId])
GO
ALTER TABLE [dbo].[FunctionRoles] CHECK CONSTRAINT
[FK_FunctionRoles_Roles]
GO
ALTER TABLE [dbo].[UserRoles]  WITH CHECK ADD  CONSTRAINT
[FK_UserRoles_Roles] FOREIGN KEY([RoleId])
REFERENCES [dbo].[Roles] ([RoleId])
GO
ALTER TABLE [dbo].[UserRoles] CHECK CONSTRAINT
[FK_UserRoles_Roles]
GO
ALTER TABLE [dbo].[UserRoles]  WITH CHECK ADD  CONSTRAINT
[FK_UserRoles_Users] FOREIGN KEY([UserId])
REFERENCES [dbo].[Users] ([UserId])
GO
ALTER TABLE [dbo].[UserRoles] CHECK CONSTRAINT
[FK_UserRoles_Users]

La table Users contiendra les informations d’identification du compte.


La table Rôles contiendra le nom du groupe d’autorisations.
Le tableau Fonctions contiendra des informations fonctionnelles.
Cliquez avec le bouton droit sur votre dossier Entités, puis sélectionnez Ajouter = >
Nouveaux éléments...=>ADO.NET Entity Data Model=> codez d’abord à partir de la
base de données pour créer votre classe d’entité, puis entrez le nom de votre
modèle ApplicationDbContext.
J’utilise le référentiel générique, le modèle UnitOfWork avec Entity Framework pour
créer la couche DataAccess, ce qui m’aide à gérer le CRUD.
Le modèle de référentiel est la couche intermédiaire entre la couche de logique
métier et la couche d’accès aux données, ce qui rend l’accès aux données plus strict
et sécurisé.
L’unité de travail est le concept lié à la mise en œuvre efficace du modèle de
référentiel. Il nous permet d’exécuter une seule transaction de base de données qui
implique plusieurs opérations d’insertion, de mise à jour, de suppression.
La création d’une interface IRepository vous permet d’accéder à vos données sql.

public interface IRepository<T> where T : class


{
    T GetById(object id);
    IList<T> GetList();
    Task<IList<T>> GetListAsync();
    T Find(Expression<Func<T, bool>> expression);
    Task<T> FindAsync(Expression<Func<T, bool>> expression);
    IList<T> GetList(Expression<Func<T, bool>> expression);
    Task<IList<T>> GetListAsync(Expression<Func<T, bool>>
expression);
    void Insert(T entity);
    void Update(T entity);
    void Delete(T entity);
    Task SaveChangesAsync();
}

Création d’un BaseRepository implémentez IRepository comme indiqué ci-dessous.

public abstract class BaseRepository<T> : IRepository<T> where


T : class
{
    private readonly ApplicationDbContext _dataContext;
 
    public BaseRepository(ApplicationDbContext dataContext)
    {
        _dataContext = dataContext;
    }
 
    public void Delete(T entity)
    {
        _dataContext.Set<T>().Remove(entity);
    }
 
    public T GetById(object id)
    {
        return _dataContext.Set<T>().Find(id);
    }
 
    public void Insert(T entity)
    {
        _dataContext.Set<T>().Add(entity);
    }
 
    public IList<T> GetList()
    {
        return _dataContext.Set<T>().ToList();
    }
 
    public async Task<IList<T>> GetListAsync()
    {
        return await _dataContext.Set<T>().ToListAsync();
    }
 
    public IList<T> GetList(Expression<Func<T, bool>>
expression)
    {
        return
_dataContext.Set<T>().Where(expression).ToList();
    }
 
    public T Find(Expression<Func<T, bool>> expression)
    {
        return
_dataContext.Set<T>().Where(expression).SingleOrDefault();
    }
 
    public async Task<T> FindAsync(Expression<Func<T, bool>>
expression)
    {
        return await
_dataContext.Set<T>().Where(expression).SingleOrDefaultAsync();
    }
 
    public async Task<IList<T>>
GetListAsync(Expression<Func<T, bool>> expression)
    {
        return await
_dataContext.Set<T>().Where(expression).ToListAsync();
    }
 
    public void Update(T entity)
    {
        _dataContext.Entry<T>(entity).State =
EntityState.Modified;
    }
 
    public Task SaveChangesAsync()
    {
        return _dataContext.SaveChangesAsync();
}
}

La création d’un IUserRepository vous permet d’accéder aux données de la table


utilisateur.

public interface IUserRepository : IRepository<User>


{
}

Création d’un UserRepository implémenter BaseRepository<User>, IUserRepository


public class UserRepository : BaseRepository<User>,
IUserRepository
{
    public UserRepository(ApplicationDbContext dataContext)
        : base(dataContext)
    {
    }
}

Enfin, Créer un IUnitOfWork vous permet de gérer des données avec transaction.

public class UnitOfWork : IUnitOfWork


{
    private bool _disposed;
    private readonly ApplicationDbContext _dataContext;
    private IUserRepository _userRepository;
 
    public UnitOfWork()
    {
        _dataContext = new ApplicationDbContext();
    }
 
    public IDatabaseTransaction BeginTransaction()
    {
        return new DatabaseTransaction(_dataContext);
    }
 
    public IUserRepository User => _userRepository ??
(_userRepository = new UserRepository(_dataContext));
 
    public void SaveChanges()
    {
        _dataContext.SaveChanges();
    }
 
    protected void Dispose(bool disposing)
    {
        if (!this._disposed)
        {
            if (disposing)
                _dataContext.Dispose();
        }
        this._disposed = true;
    }
 
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}
Création d’un RibbonForm en tant que formulaire principal.

public partial class frmMain : RibbonForm


{
    private static frmMain _instance = null;
 
    public static frmMain Instance
    {
        get
        {
            if (_instance == null)
                _instance = new frmMain();
            return _instance;
        }
        set { _instance = value; }
    }
 
    public frmMain()
    {
        InitializeComponent();
    }
 
    private void frmMain_Load(object sender, EventArgs e)
    {
        frmLoginInformation frm = new frmLoginInformation()
{ MdiParent = this };
        frm.Show();
        //Init Plugin
        try
        {
            AppPlugin.InitPlugin();
            //Init Component
            _instance = this;
        }
        catch (Exception ex)
        {
            XtraMessageBox.Show(ex.Message, "Message",
MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
 
    private void ItemLogOut_Click(object sender, EventArgs e)
    {
        Cursor.Current = Cursors.WaitCursor;
        ClearAllItems();
        this.Hide();
        frmLogin.Instance.Show();
        //Init Form Login
        Logout.Visibility =
DevExpress.XtraBars.BarItemVisibility.Never;
        Cursor.Current = Cursors.Default;
    }
 
    private void ClearAllItems()
    {
        //Remove Forms
        for (int k = tabbedView.Documents.Count - 1; k >= 0;
k--)
            (tabbedView.Documents[k].Control as Form).Close();
 
        //Remove all item in ribbon control.
        for (int i = ribbon.Pages.Count - 1; i >= 0; i--)
        {
            for (int j = ribbon.Pages[i].Groups.Count - 1; j >=
0; j--)
                ribbon.Pages[i].Groups[j].ItemLinks.Clear();//
Clear item
                                                            //
Clear group
            ribbon.Pages[i].Groups.Clear();
        }
        //Clear pages
        ribbon.Pages.Clear();
    }
 
    private void frmMain_FormClosed(object sender,
FormClosedEventArgs e)
    {
        ClearAllItems();
        Application.Exit();
    }
}

Formulaire de connexion dans l’application Windows C# avec base de données


La création d’un formulaire de connexion vous permet de vous connecter avec
l’authentification de l’utilisateur comme indiqué ci-dessous.

Vous pouvez utiliser ce formulaire pour vous connecter avec la connexion


administrateur et utilisateur en c#. C’est comme un simple formulaire de connexion
en c # pour les débutants.
Je vais créer un utilisateur par défaut pour le système de connexion c #, puis stocker
dans le fichier app.config avec le cryptage par mot de passe. Chaque fois que vous
vous connectez au système, vous devez vérifier que l’utilisateur est par défaut du
système ou l’utilisateur de l’application.

<!-- c# username and password login -->


<appSettings>
    <add key="SysUser" value="sysadmin"/>
    <add key="SysPwd" value="l/sAuuLvgbuF/6xkLO6Q9g=="/>
</appSettings>

Valeur par défaut de l’utilisateur système : sysadmin/admin


Une fois la connexion réussie, vous pouvez créer un compte administrateur ou une
connexion utilisateur en c #.
Comment valider le nom d’utilisateur et le mot de passe en c #
Il vérifie également la validation du nom d’utilisateur et du mot de passe dans
l’application Windows C #. L’utilisateur par défaut vous aide à créer votre application
avec la fonctionnalité que vous définissez.

//c# user authorization in database applications


public partial class frmLogin : DevExpress.XtraEditors.XtraForm
{
    private static frmLogin _instance = null;
    private readonly IUnitOfWork _unitOfWork;
 
    public frmLogin()
    {
        InitializeComponent();
    }
 
    public static frmLogin Instance => _instance ?? (_instance
= new frmLogin());
 
    //how to validate login form in c# windows application
    private void Login()
    {
        if (string.IsNullOrEmpty(txtUserName.Text))
        {
            XtraMessageBox.Show("Please enter your user
name.", "Message", MessageBoxButtons.OK,
MessageBoxIcon.Warning);
            txtUserName.Focus();
            return;
        }
        try
        {
            _unitOfWork = new UnitOfWork();
            User user = _unitOfWork.User.Find(u => u.UserName
== txtUserName.Text);
            if (user != null)
            {
                if (user.Status == true)
                {
                    XtraMessageBox.Show("Your account is
currently locked.", "Message", MessageBoxButtons.OK,
MessageBoxIcon.Warning);
                    txtUserName.Focus();
                    return;
                }
                if (user.Password !=
AppHelper.Encrypt(txtPassword.Text))
                {
                    XtraMessageBox.Show("Your Username and
password do not match.", "Message", MessageBoxButtons.OK,
MessageBoxIcon.Warning);
                    txtPassword.Focus();
                    return;
                }
                frmMain.Instance = null;
                UserInfo.FullName = user.FullName;
                UserInfo.UserName = txtUserName.Text;
                UserInfo.UserId = user.UserId;
                UserInfo.LoginType = UserType.None;
                AppSystem appSystem = new
AppSystem(_unitOfWork);
                appSystem.InitControl();
                Hide();
                frmMain.Instance.ShowDialog();
            }
            else
            {
                if (UserInfo.IsUserSystem(txtUserName.Text))
                {
                    if
(UserInfo.IsUserSystemLogin(txtUserName.Text,
AppHelper.Encrypt(txtPassword.Text)))
                    {
                        frmMain.Instance = null;
                        UserInfo.FullName = "System";
                        UserInfo.UserName = txtUserName.Text;
                        UserInfo.LoginType = UserType.System;
                        AppSystem appSystem = new
AppSystem(_unitOfWork);
                        appSystem.InitSystem();
                        Hide();
                        frmMain.Instance.ShowDialog();
                    }
                    else
                    {
                        XtraMessageBox.Show("Your Username and
password do not match.", "Message", MessageBoxButtons.OK,
MessageBoxIcon.Warning);
                        txtPassword.Focus();
                    }
                }
                else
                {
                    XtraMessageBox.Show("Your username cannot
be found in the system.", "Message", MessageBoxButtons.OK,
MessageBoxIcon.Warning);
                    txtUserName.Focus();
                }
            }
        }
        catch (Exception ex)
        {
            XtraMessageBox.Show(ex.Message, "Message",
MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}

La création d’un formulaire d’informations de connexion vous permet d’afficher les


informations d’identification de l’utilisateur comme indiqué ci-dessous.
Vous pouvez initialiser vos données lors de l’événement Form_Load.

private void frmLoginInformation_Load(object sender, EventArgs


e)
{
    lblFullName.Text = UserInfo.FullName;
    lblUser.Text = UserInfo.UserName;
    lblDateLogin.Text = DateTime.Now.ToString();
    frmMain.Instance.ItemLogOut.Caption = UserInfo.UserName;
    if (UserInfo.LoginType == UserType.None)
        frmMain.Instance.Logout.Width = 40 +
UserInfo.UserName.Length * 3;
    else
        frmMain.Instance.Logout.Width = 80;
    frmMain.Instance.Logout.Hint = UserInfo.UserName;
    frmMain.Instance.Logout.Visibility =
BarItemVisibility.Always;
}
La création d’un formulaire de rôle vous permet de créer un nouveau rôle.

Formulaire de connexion multi-utilisateur en c #


Faites de même pour le formulaire utilisateur et fonction.
La création d’un formulaire de rôle d’utilisateur vous permet de définir des rôles pour
des utilisateurs spécifiques.
Chaque utilisateur possédera un ou plusieurs rôles. Lorsque l’utilisateur se connecte
à l’application, en fonction du rôle spécifique, il verra les fonctions respectives

namespace FoxApp.UI.Forms.Systems
{
    public partial class frmUserRoles :
DevExpress.XtraEditors.XtraForm
    {
        private readonly IUnitOfWork _unitOfWork;
        private User _user;
        public frmUserRoles(User user, IUnitOfWork unitOfWork)
        {
            InitializeComponent();
            _user = user;
            _unitOfWork = unitOfWork;
        }
 
        private async void frmUserRoles_Load(object sender,
EventArgs e)
        {
            gridControl.DataSource = await
_unitOfWork.Role.GetListAsync();
            for (int i = 0; i < gridView.DataRowCount; i++)
            {
                Role role = gridView.GetRow(i) as Role;
                if (role != null)
                {
                    if (_user.Roles.Where(r => r.RoleId ==
role.RoleId).Count() > 0)
                        gridView.SelectRow(i);
                }
            }
        }
 
        private async void btnSave_ItemClick(object sender,
DevExpress.XtraBars.ItemClickEventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            try
            {
                WaitFormHelper.ShowWaitForm(this);
                gridView.FocusedRowHandle = -1;
                for (int i = 0; i < gridView.DataRowCount; i++)
                {
                    if (gridView.IsRowSelected(i))
                    {
                        Role role = gridView.GetRow(i) as Role;
                        if (role != null)
                        {
                            if (!role.Users.Contains(_user))
                                role.Users.Add(_user);
                        }
                    }
                    else
                    {
                        Role role = gridView.GetRow(i) as Role;
                        if (role != null)
                        {
                            if (role.Users.Contains(_user))
                                role.Users.Remove(_user);
                        }
                    }
                }
                await _unitOfWork.Role.SaveChangesAsync();
                WaitFormHelper.SetWaitFormCaption(this, "Your
data has been saved successfully.");
            }
            catch (Exception ex)
            {
                WaitFormHelper.CloseWaitForm(this);
                XtraMessageBox.Show(ex.Message, "Message",
MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                WaitFormHelper.CloseWaitForm(this);
            }
            Cursor.Current = Cursors.Default;
        }
    }
}

La création d’un formulaire de modification de mot de passe permet à l’utilisateur de


modifier le mot de passe comme indiqué ci-dessous.
private void Save()
{
    if (txtNewPassword.Text != txtConfirm.Text)
    {
        XtraMessageBox.Show("Your new password and confirmation
password are incorrect.", "Message", MessageBoxButtons.OK,
MessageBoxIcon.Warning);
        txtConfirm.Focus();
        return;
    }
    if (UserInfo.LoginType == UserType.None)
    {
        User user = _unitOfWork.User.Find(u => u.UserName ==
UserInfo.UserName);
        if (user != null)
        {
            if (user.Password !=
AppHelper.Encrypt(txtOldPassword.Text))
            {
                XtraMessageBox.Show("Your Username and password
do not match.", "Message", MessageBoxButtons.OK,
MessageBoxIcon.Warning);
                txtOldPassword.Focus();
                return;
            }
            user.Password =
AppHelper.Encrypt(txtNewPassword.Text);
            _unitOfWork.User.Update(user);
            _unitOfWork.User.SaveChanges();
            XtraMessageBox.Show("You have successfully changed
your password.", "Message", MessageBoxButtons.OK,
MessageBoxIcon.Information);
            Close();
        }
        else
        {
            XtraMessageBox.Show("Your old password is
incorrect.", "Message", MessageBoxButtons.OK,
MessageBoxIcon.Warning);
            txtOldPassword.Focus();
        }
    }
    else
    {
        if (UserInfo.IsUserSystemLogin(UserInfo.SysUser,
AppHelper.Encrypt(txtOldPassword.Text)))
        {
            UserInfo.ChangeSystemPassword(AppHelper.Encrypt(txt
NewPassword.Text));
            XtraMessageBox.Show("You have successfully changed
your password.", "Message", MessageBoxButtons.OK,
MessageBoxIcon.Information);
            Close();
        }
        else
        {
            XtraMessageBox.Show("Your old password is
incorrect.", "Message", MessageBoxButtons.OK,
MessageBoxIcon.Warning);
            txtOldPassword.Focus();
        }
    }
}

Authentification et autorisation dans l’application Windows c #


La création d’un formulaire d’autorisation vous permet de définir des fonctions à rôle.

private async void btnSave_ItemClick(object sender,


DevExpress.XtraBars.ItemClickEventArgs e)
{
    Cursor.Current = Cursors.WaitCursor;
    Role role = cboRoleName.GetSelectedDataRow() as Role;
    if (role != null)
    {
        try
        {
            WaitFormHelper.ShowWaitForm(this);
            List<Function> functions =
treeListFunction.DataSource as List<Function>;
            if (functions != null)
            {
                foreach (Function f in functions)
                {
                    TreeListNode node =
treeListFunction.FindNodeByFieldValue("FunctionId",
f.FunctionId);
                    if ((node.CheckState == CheckState.Checked)
|| (node.CheckState == CheckState.Indeterminate))
                    {
                        if (!f.Roles.Contains(role))
                            f.Roles.Add(role);
                    }
                    else
                    {
                        if (f.Roles.Contains(role))
                            f.Roles.Remove(role);
                    }
                }
                await _unitOfWork.Function.SaveChangesAsync();
            }
            WaitFormHelper.SetWaitFormCaption(this, "Your data
has been saved successfully.");
        }
        catch (Exception ex)
        {
            WaitFormHelper.CloseWaitForm(this);
            XtraMessageBox.Show(ex.Message, "Message",
MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        finally
        {
            WaitFormHelper.CloseWaitForm(this);
        }
    }
    else
    {
        XtraMessageBox.Show("Please select your role
name.", "Message", MessageBoxButtons.OK,
MessageBoxIcon.Warning);
        cboRoleName.Focus();
    }
    Cursor.Current = Cursors.Default;
}

Comment chiffrer le mot de passe dans le fichier app.config c #


Si vous souhaitez configurer la connexion SQL, vous pouvez appuyer sur Ctrl + R
sur l’écran de connexion, puis entrer votre compte SQL.
La création d’un formulaire de configuration vous permet de vous connecter à votre
serveur SQL, puis d’enregistrer votre chaîne de connexion dans le
fichier app.config avec les données de chaîne de connexion encrypt.

Si vous réussissez à vous connecter à la base de données SQL, le système chiffre


automatiquement la chaîne de connexion et la stocke dans le fichier app.config

//authentication and authorization in windows application c#

public void InitControl()


{

int lIndex = 0, sIndex = 0;

//Init ComponentModel

((System.ComponentModel.ISupportInitialize)
(frmMain.Instance.ribbon)).BeginInit();

//Init Image

frmMain.Instance.ribbon.LargeImages =
frmMain.Instance.LimageCollection;

//Clear image collection

frmMain.Instance.LimageCollection.Images.Clear();

frmMain.Instance.SimageCollection.Images.Clear();

//Init

User user = _unitOfWork.User.GetApplyEagerLoading(u =>


u.UserId == UserInfo.UserId, r => r.Roles, r =>
r.Roles.Select(f => f.Functions)).SingleOrDefault();

if (user != null)

//Init Function

List<Function> list = new List<Function>();

foreach (Role role in user.Roles)

var functions = role.Functions.Where(f => f.Status


== true).ToList();

foreach (Function f in functions)

{
if (!list.Contains(f))

list.Add(f);

//

var tabs = list.Where(f => f.Type == "Tab").OrderBy(f


=> f.Order).ToList();

foreach (Function tab in tabs)

//Add Page

RibbonPage rPage = new RibbonPage(tab.FunctionName)


{ Name = $"ribbonPage{tab.FunctionId}" };

frmMain.Instance.ribbon.Pages.Add(rPage);

var groups = list.Where(f => f.Type == "Group" &&


f.ParentId == tab.FunctionId).OrderBy(f => f.Order).ToList();

foreach (Function group in groups)

//Add PageGroup

RibbonPageGroup rGroup = new


RibbonPageGroup(group.FunctionName) { Name =
$"ribbonPageGroup{group.FunctionId}", AllowTextClipping = false
};

rPage.Groups.Add(rGroup);

var items = list.Where(f => f.Type == "Item" &&


f.ParentId == group.FunctionId).OrderBy(f => f.Order).ToList();
foreach (Function item in items)

if (item.Menu == true)

//Add main menu

BarSubItem mainMenu = new


BarSubItem(frmMain.Instance.ribbon.Manager, item.FunctionName)
{ Name = $"barButtonItem{item.FunctionId}", Tag = new
AppModule() { Id = item.FunctionId, ModuleId = item.FormName,
Caption = item.FunctionName, Type = item.FormStyle, MethodName
= item.MethodName, Parameter = item.Parameter }, Hint =
item.FunctionName, Description = item.FunctionName };

frmMain.Instance.ribbon.Items.Add(mainMenu);

if (item.Image != null)

if (item.RibbonStyle == true)

frmMain.Instance.SimageCollection.AddImage(DataConvert.ByteArra
yToImage(item.Image));

else

frmMain.Instance.LimageCollection.AddImage(DataConvert.ByteArra
yToImage(item.Image));

if
(frmMain.Instance.SimageCollection.Images.Count > 0 &&
item.RibbonStyle == true)

{
mainMenu.ImageIndex = sIndex;

sIndex++;

mainMenu.RibbonStyle =
RibbonItemStyles.SmallWithoutText |
RibbonItemStyles.SmallWithText;

else

mainMenu.LargeImageIndex =
lIndex;

lIndex++;

mainMenu.RibbonStyle =
RibbonItemStyles.All;

//Add item into menu

var menus = list.Where(f => f.Type ==


"Item" && f.ParentId == item.FunctionId).OrderBy(f =>
f.Order).ToList();

foreach (Function menu in menus)

if (menu.Menu == true)

//Add sub menu

BarSubItem subMenu = new


BarSubItem(frmMain.Instance.ribbon.Manager, menu.FunctionName)
{ Name = $"barButtonItem{menu.FunctionId}", Tag = new
AppModule() { Id = menu.FunctionId, ModuleId = menu.FormName,
Caption = menu.FunctionName, Type = menu.FormStyle, MethodName
= menu.MethodName, Parameter = menu.Parameter }, Hint =
menu.FunctionName, Description = menu.FunctionName };

frmMain.Instance.ribbon.Items.Add(subMenu);

var subMenus = list.Where(f =>


f.Type == "Item" && f.ParentId == menu.FunctionId).OrderBy(f =>
f.Order).ToList();

foreach (Function sMenu in


subMenus)

//Add image

if (sMenu.Image != null)

frmMain.Instance.SimageCollection.AddImage(DataConvert.ByteArra
yToImage(sMenu.Image));

BarButtonItem bItem = new


BarButtonItem() { Caption = sMenu.FunctionName, Name =
$"barButtonItem{sMenu.FunctionId}", Tag = new AppModule() { Id
= sMenu.FunctionId, ModuleId = sMenu.FormName, Caption =
sMenu.FunctionName, Type = sMenu.FormStyle, MethodName =
sMenu.MethodName, Parameter = sMenu.Parameter }, Hint =
sMenu.FunctionName, Description = sMenu.FunctionName };

if
(frmMain.Instance.SimageCollection.Images.Count > 0 &&
sMenu.Image != null)

bItem.ImageIndex =
sIndex;
sIndex++;

bItem.ItemClick +=
ItemClick;

bItem.RibbonStyle =
RibbonItemStyles.All;

subMenu.LinksPersistInfo.Add(new LinkPersistInfo(bItem,
sMenu.BeginGroup ?? false));

frmMain.Instance.ribbon.Items.Add(bItem);

mainMenu.ItemLinks.Add(subMenu,
menu.BeginGroup ?? false);

else

//Add image

if (menu.Image != null)

frmMain.Instance.SimageCollection.AddImage(DataConvert.ByteArra
yToImage(menu.Image));

BarButtonItem bItem = new


BarButtonItem() { Caption = menu.FunctionName, Name =
$"barButtonItem{menu.FunctionId}", Tag = new AppModule() { Id =
menu.FunctionId, ModuleId = menu.FormName, Caption =
menu.FunctionName, Type = menu.FormStyle, MethodName =
menu.MethodName, Parameter = menu.Parameter }, Hint =
menu.FunctionName, Description = menu.FunctionName };
bItem.ItemClick += ItemClick;

bItem.RibbonStyle =
RibbonItemStyles.All;

if
(frmMain.Instance.SimageCollection.Images.Count > 0 &&
menu.Image != null)

bItem.ImageIndex = sIndex;

sIndex++;

mainMenu.LinksPersistInfo.Add(new LinkPersistInfo(bItem,
menu.BeginGroup ?? false));

frmMain.Instance.ribbon.Items.Add(bItem);

rGroup.ItemLinks.Add(mainMenu, true);

else

if (item.Image != null)

if (item.RibbonStyle == true)

frmMain.Instance.SimageCollection.AddImage(DataConvert.ByteArra
yToImage(item.Image));
else

frmMain.Instance.LimageCollection.AddImage(DataConvert.ByteArra
yToImage(item.Image));

BarButtonItem bItem = new


BarButtonItem(frmMain.Instance.ribbon.Manager,
item.FunctionName) { Name = $"barButtonItem{item.FunctionId}",
Tag = new AppModule() { Id = item.FunctionId, ModuleId =
item.FormName, Caption = item.FunctionName, Type =
item.FormStyle, MethodName = item.MethodName, Parameter =
item.Parameter }, Hint = item.FunctionName, Description =
item.FunctionName };

bItem.ItemClick += ItemClick;

if (item.Image != null)

if
(frmMain.Instance.SimageCollection.Images.Count > 0 &&
item.RibbonStyle == true)

bItem.ImageIndex = sIndex;

sIndex++;

bItem.RibbonStyle =
RibbonItemStyles.SmallWithoutText |
RibbonItemStyles.SmallWithText;

rGroup.ItemLinks.Add(bItem,
item.BeginGroup ?? false);

else
{

bItem.LargeImageIndex = lIndex;

lIndex++;

bItem.RibbonStyle =
RibbonItemStyles.All;

rGroup.ItemLinks.Add(bItem,
item.BeginGroup ?? false);

else

bItem.RibbonStyle =
RibbonItemStyles.All;

rGroup.ItemLinks.Add(bItem,
item.BeginGroup ?? false);

frmMain.Instance.ribbon.Items.Add(bItem);

//Add more

//
((System.ComponentModel.ISupportInitialize)
(frmMain.Instance.ribbon)).EndInit();

Nous allons lire les fonctionnalités de la base de données, puis initialiser l’application
en fonction des rôles spécifiés.
À travers cet article, j’ai présenté les bases de la gestion des utilisateurs et des
systèmes d’authentification. Vous pouvez acheter le code source pour l’apprendre ou
l’intégrer dans votre propre système. Il s’agit d’un système qui facilite
l’authentification et la gestion des utilisateurs.

Vous aimerez peut-être aussi