2017-10-20 36 views
1

J'ai un formulaire de connexion dans Visual Studio C# et en voici une capture d'écran.Création de l'authentification Windows et de l'authentification SQL Server dans le formulaire de connexion

https://i.stack.imgur.com/uziUD.png

Mon but est de permettre à l'utilisateur de choisir de se connecter en utilisant l'authentification Windows, dans un lieu de travail que nous utilisons le réseau LAN ou en utilisant l'authentification SQL Server (nom d'utilisateur et mot de passe sont stockés dans le serveur -> sécurité -> connexion).

est le code ci-dessous jusqu'à présent:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Data.SqlClient; 
using System.Data.Sql; 
using System.Data.OleDb; 

namespace Login_HouseKeeping_ 
{ 
    public partial class Form1: Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     // Connection string 
     string cs = @"Data Source = 172.28.40.19\CASINO2008R2; Initial catalog =GCVS2_DEV_GHR; Integrated Security = True;"; 

     // Login click event 
     private void button1_Click(object sender, EventArgs e) 
     { 
      if (textBox1.Text == "" || textBox2.Text == "") 
      { 
       MessageBox.Show("Please provide Username and Password"); 
       return; 
      } 
      else 
       try 
       { 
        //Create sqlconnection 
        SqlConnection con = new SqlConnection(cs); 

        SqlCommand cmd = new SqlCommand(@"SELECT * FROM Logins WHERE Username = @username AND Password = @Password", con); 

        cmd.Parameters.AddWithValue("@username", textBox1.Text); 
        cmd.Parameters.AddWithValue("@Password", textBox2.Text); 

        con.Open(); 

        SqlDataAdapter adapt = new SqlDataAdapter(cmd); 
        DataSet ds = new DataSet(); 
        adapt.Fill(ds); 

        con.Close(); 

        int count = ds.Tables[0].Rows.Count; 

        // if count equals to 1, then show frmMain form 
        if (count == 1) 
        { 
         MessageBox.Show("Login successful"); 
         this.Hide(); 

         frmMain fm = new frmMain(); 
         fm.Show(); 
        } 
        else 
        { 
         MessageBox.Show("Login failed"); 
        } 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message); 
       } 
     } 

     private void textBox2_TextChanged(object sender, EventArgs e) 
     { 
      textBox2.PasswordChar = '*'; 
     } 

     private void btn_Exit_Click(object sender, EventArgs e) 
     { 
      this.Close(); 
     } 
    } 
} 

Je ne peux pas sembler trouver de nombreuses ressources sur la mise en œuvre de ces deux authentification dans mon login. Comment puis-je y parvenir?

EDIT:

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private void label2_Click(object sender, EventArgs e) 
     { 

     } 

     private void btn_Exit_Click(object sender, EventArgs e) 
     { 
      this.Close(); 
     } 

     private void btn_Login_Click(object sender, EventArgs e) 
     { 



      var connStrBldr = new System.Data.SqlClient.SqlConnectionStringBuilder(); 
      connStrBldr.DataSource = "172.28.40.19\CASINO2008R2"; 
      connStrBldr.InitialCatalog = "GCVS2_DEV_GHR"; 
      if (WindowsAuth) 
      { 
       connStrBldr.IntegratedSecurity = true; 
      } 
      else 
      { 
       connStrBldr.IntegratedSecurity = false; 
       connStrBldr.UserID = textBox1.Text; 
       connStrBldr.Password = textBox2.Text; 
      } 
      using (SqlConnection con = new SqlConnection(connStrBldr.ToString())) 
      { 
       con.Open(); 
       //do your lookup on login here 
      } 







     } 

     private void WindowsAuth_CheckedChanged(object sender, EventArgs e) 
     { 

     } 

     private void SqlAuth_CheckedChanged(object sender, EventArgs e) 
     { 

     } 
    } 
} 
+0

Quel est le problème? –

+0

Le problème est que je ne peux pas comprendre comment avoir l'authentification Windows et l'authentification du serveur SQL dans ma connexion. –

+0

Authentification Windows pour votre répertoire actif? –

Répondre

1

Je n'affichant cette réponse puisque OP peut ne pas sembler faire @ réponse de Tim travail. Crédits à @Tim.

Il suffit d'utiliser simplement:

EDIT: Changé depuis le nom d'utilisateur et mot de passe ne sont pas obligatoires pour l'authentification Windows.

private void btn_Login_Click(object sender, EventArgs e) 
{ 
    bool useWindowsAuth = WindowsAuth.Checked; // Assuming that WindowsAuth is your radio button 

    string userName = string.Empty; 
    string password = string.Empty; 

    if(!useWindowsAuth) 
    { 
     userName = textBox1.Text; 
     password = textBox2.Text; 

     if (string.IsNullOrWhiteSpace(userName) || string.IsNullOrWhiteSpace(password)) 
     { 
      MessageBox.Show("Please provide Username and Password"); 
      return; 
     } 
    } 

    var connStrBldr = new System.Data.SqlClient.SqlConnectionStringBuilder(); 
    connStrBldr.DataSource = @"172.28.40.19\CASINO2008R2"; 
    connStrBldr.InitialCatalog = "GCVS2_DEV_GHR"; 

    if (useWindowsAuth) 
    { 
     connStrBldr.IntegratedSecurity = true; 
    } 
    else 
    { 
     connStrBldr.IntegratedSecurity = false; 
     connStrBldr.UserID = userName; 
     connStrBldr.Password = password; 
    } 

    bool validUser = true; 

    try 
    { 
     using (SqlConnection con = new SqlConnection(connStrBldr.ToString())) 
     { 
      con.Open(); 
      //do your lookup on login here 
     } 
    } 
    catch(SqlException) // An exception will be caught if invalid credentials were used. 
    { 
     validUser = false; 
    } 

    if(validUser) 
     MessageBox.Show("Login successful!"); 
    else 
     MessageBox.Show("Login failed!");  
    } 
} 

J'ai vérifié que le code fonctionne en utilisant un exemple de projet. Vous devez simplement vous assurer de ce qui suit:

  1. Le nom d'utilisateur et le mot de passe sont corrects (Serveur> Sécurité). L'utilisateur a accès au tableau GCVS2_DEV_GHR. Ceci peut être configuré sous (Serveur> Sécurité> Utilisateur)

De plus, cette façon de coder n'est pas un bon moyen de le faire mais puisque vous semblez nouveau en C#, assurez-vous d'en apprendre davantage sur les bonnes pratiques.

+0

Voulez-vous dire que cela fonctionne sur votre ordinateur? Vous pouvez vous connecter en utilisant les deux modes d'authentification? –

+0

Ok, j'ai essayé votre code, cela fonctionne mais j'ai une question, si je veux me connecter via l'authentification Windows, dois-je entrer un nom d'utilisateur et un mot de passe et me connecter ou simplement les laisser vides? –

+0

laissez-les simplement vides. Ce n'est pas nécessaire puisque 'IntegratedSecurity' est réglé sur' true' –

1

L'authentification est contrôlé par votre chaîne de connexion. Votre meilleur pari est d'utiliser System.Data.SqlClient.SqlConnectionStringBuilder pour construire la chaîne de connexion dynamique en fonction de si vous voulez auth SQL Server ou Windows auth:

var connStrBldr = new System.Data.SqlClient.SqlConnectionStringBuilder(); 
connStrBldr.DataSource = "172.28.40.19\CASINO2008R2"; 
connStrBldr.InitialCatalog = "GCVS2_DEV_GHR"; 
if (useWindowsAuth) { 
    connStrBldr.IntegratedSecurity = true; 
} else { 
    connStrBldr.IntegratedSecurity = false; 
    connStrBldr.UserID = textBox1.Text; 
    connStrBldr.Password = textBox2.Text; 
} 
using (SqlConnection con = new SqlConnection(connStrBldr.ToString())) { 
    con.Open(); 
    //do your lookup on login here 
} 
+0

Donc, ce que cela fait est-il permettre à l'utilisateur de choisir Windows auth et de procéder à la connexion avec leurs informations d'identification ou de choisir sql serveur auth et login avec les informations d'identification de connexion stockées sur le serveur SQL? –

+0

Que faire si l'utilisateur veut effectuer une authentification Windows (Active Directory) avec les informations d'identification d'un autre utilisateur? Cette approche ne limite pas vos informations d'identification à celle de l'utilisateur actuellement connecté? –

+0

Lorsque vous définissez 'IntegratedSecurity = false', cela signifie qu'il utilisera l'authentification de SQL Server, qui est entièrement gérée par le serveur SQL, et non gérée par votre table' LOGIN'. Utilisez 'CREATE LOGIN' pour gérer les connexions pour l'authentification SQL Server. – Tim