Autenticação personalizada ASP.NET C#
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public partial class Login : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
// Custom login control
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
try
{
string uname = Login1.UserName.Trim();
string password = Login1.Password.Trim();
bool flag = AuthenticateUser(uname, password);
if (flag == true)
{
e.Authenticated = true;
Login1.DestinationPageUrl = "Default.aspx";
}
else
e.Authenticated = false;
}
catch (Exception)
{
e.Authenticated = false;
}
}
private bool AuthenticateUser(string uname, string password)
{
bool bflag = false;
string connString = "Server=DEVSERVER;User ID=sa;Password=whatpassword;Database=CommonUser";
string connstring2 = "Server=DEVSERVER;User ID=sa;Password=whatpassword;Database=Admins";
string strSQL = "Select * from dbo.Users where Username ='" + uname + "' and Password ='" + password + "'";
DataSet userDS = new DataSet();
SqlConnection m_conn;
SqlDataAdapter m_dataAdapter;
SqlCommand m_Command;
try
{
m_conn = new SqlConnection(connString);
m_conn.Open();
m_dataAdapter = new SqlDataAdapter(strSQL, m_conn);
m_dataAdapter.Fill(userDS);
m_conn.Close();
}
catch (Exception)
{
userDS = null;
}
if (userDS != null)
{
if (userDS.Tables[0].Rows.Count > 0)
bflag = true;
}
return bflag;
}
}
Tenho outra base de dados para os utilizadores da Administração. Então minha pergunta é Como posso fazê-lo verificar a base de dados para os usuários de administração. Também Como posso restringir usuários comuns de certas páginas como ~Admin / AdminPages.aspx? Estou a tentar perceber isto.
Qualquer ajuda seria muito apreciada. ;)
obrigado antecipadamente
4 answers
Estás a fazer mal!
Não estou a argumentar contra a utilização de uma base de dados personalizada. Asp.Net já está incorporado. nem sequer estou a argumentar contra a codificação manual disto num método em que se pode estar a usar o muitobelo modelo de Fornecedor de fichas que Asp.Net foi incorporada. O que estou a argumentar é o quão aberto este código é para um Sql. Ataque de injecção.Considere por um segundo o que aconteceria se eu digitasse {[[0]} como o nome de utilizador? COISAS MÁS, MEU!!!!
Ok, então siga seriamente os links que eu coloquei lá e por favor, por favor, no mínimo use consultas parametrizadas!
string strSQL = "Select * from dbo.Users where Username ='" + uname + "' and Password ='" + password + "'";
Nunca Nunca faça uma concatenação de string para construir uma consulta. isto deixa a sua aplicação aberta à injecção de SQL. Use uma pesquisa parametrizada em vez disso.
Porque é que tem uma base de dados separada para administradores e utilizadores comuns? Não guardarias todos os logins numa única tabela numa única base de dados? Então use um único campo "IsAdmin" ou use uma tabela de papéis separada e tabela de UsersInRoles para determinar quais usuários são administrativos ou não.
Qual é a sua razão para não usar o fornecedor de membros do builtin? Você configura o provedor de compilação para usar qualquer banco de dados, não apenas o AppData\aspnet.mdf.
Você normalmente restringe páginas diferentes a diferentes usuários usando papéis, isso pode ser definido na web.ficheiro de configuração dentro do elemento de autorização.
Se realmente quiser criar um sistema de autenticação simples personalizado, use algo como http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.html para atribuir manualmente as funções do utilizador à identidade do utilizador.
Usa o modelo de Fornecedor de membros. Se você não quiser usar o provedor padrão, em seguida, implementar o seu próprio personalizado. Mas honestamente, é muito fácil usar o provedor embutido e adaptá-lo a qualquer coisa que você querer.