ASP.NET 인증 Window인증, Forms 인증, Passport인증
- 모드 3가지1. Windows 인증
- OS의 계정을 사이트의 계정으로 사용
- 대부분의인증 처리를 OS가 담당
- 가장 손쉽게 구현
- 내부 네트워크(사내 사이트, 소규모)
- ASP.NET 기본인증
2. Forms 인증 **(대부분 이거를 많이 사용한다.)
- 가장 대중화된 방법
- 인증에 관련된 작업을 직접 구현(아이디+암호 = 로그인)
- 계정을 별도로 관리(데이타베이스)
3. Passport 인증
- 통합 인증
- 연합을 맺은 사이트 중 한군데서 로그인을 해도 나머지 사이트 효력..
회원 사이트 구현
-> 사이트 입장(방문)
1. 회원
2. 비회원
-> 프로그램 관점
1. 로그인을 한사람
2. 로그인을 하지 못한 사람
로그인(Login)
- 인증을 받기 위한 행동
- 인증받지 못한 유저 -> 인증받은 유저 : 회원
로그아웃(Logout)
- 인증을 해지하기 위한 행동
- 인증받은 유저 -> 인증받지 못한 유저(회원? or 비회원?)
ASP.NET 보안(인증) 구현
1. Authehication(인증)
- 로그인 or 로그아웃
2. Authorization(허가)
- 유저가 특정 행동을 할 수 있는지 확인!!
- 권한
로그인
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h2>
Login.aspx</h2>
<h2>
<br />
아이디 :
<asp:TextBox ID="TextBoxID" runat="server" Width="100px"></asp:TextBox>
<br />
<br />
암호 :
<asp:TextBox ID="TextBoxPwd" runat="server" Width="100px"></asp:TextBox>
<br />
<br />
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="로그인"
Width="100px" />
<br />
</h2>
<br />
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;//연결 문자열
using System.Web.Security;//인증
public partial class Login : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
//인증
// - DB에 등록된 ID & Pwd 올바르게 기입?
// -> 인증 쿠키 발급
SqlConnection con = new SqlConnection();
con.ConnectionString = ConfigurationManager.ConnectionStrings["ASPNETConnectionString"].ConnectionString;//web.config
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = string.Format("select count(*) from tblMember where id='{0}' and pwd='{1}'", TextBoxID.Text.Trim(), TextBoxPwd.Text.Trim());//?
con.Open();
int result = (int)cmd.ExecuteScalar();
if (result == 1)
{
//로그인 성공!!
// -> 표식(인증) -> 쿠키 발급
//Response.Cookies["_Auth"].Value = "hong";
FormsAuthentication.SetAuthCookie(TextBoxID.Text.Trim(), false);
//추가 정보 가져오기
cmd.CommandText = string.Format("select name, lv from tblMember where id='{0}'", TextBoxID.Text.Trim());
SqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
Response.Cookies["lv"].Value = reader["lv"].ToString();
Response.Cookies["name"].Value = Server.UrlEncode(reader["name"].ToString());
//Session["name"] = reader["name"].ToString();
}
reader.Close();
//알림X -> Response.Redirect()
//알림O -> alert() -> location.href=""
string script = "<script type='text/javascript'>alert('로그인 성공!!');location.href='" + FormsAuthentication.GetRedirectUrl(TextBoxID.Text, false) + "';</script>";
this.ClientScript.RegisterClientScriptBlock(this.GetType(), "login", script);
}
else
{
string script = "<script type='text/javascript'>alert('아이디나 암호가 올바르지 않습니다.');</script>";
this.ClientScript.RegisterClientScriptBlock(this.GetType(), "login", script);
}
con.Close();
}
}
Default
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>
Default.aspx<br />
<br />
[사이트 시작 페이지]<br />
<br />
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="로그인"
Width="210px" />
<asp:Button ID="Button2" runat="server" Text="로그아웃" Width="199px"
onclick="Button2_Click" />
</h1>
<h2>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</h2>
<h2>
<asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
<br />
<br />
<asp:Button ID="Button3" runat="server" Text="회원만 클릭할 수 있는 버튼" Width="244px" />
<br />
<br />
<asp:Button ID="Button4" runat="server" Text="관리자만 클릭할 수 있는 버튼" Width="244px" />
</h2>
<p>
</p>
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//로그인 유무 확인
//if (Request.Cookies["_Auth"] != null)
if (this.User.Identity.IsAuthenticated)
{
//로그인O
Button1.Visible = false;
Button2.Visible = true;
Label1.Visible = true;
Label2.Visible = true;
//홍길동님(hong, Lv 1)
// -> Select
//Label1.Text = this.User.Identity.Name;
//Label1.Text = Request.Cookies["lv"].Value;
Label1.Text = string.Format("{0}님({1}, Lv{2})", Server.UrlDecode(Request.Cookies["name"].Value), User.Identity.Name, Request.Cookies["lv"].Value);
Button3.Enabled = true;
if (Request.Cookies["lv"].Value == "2")
Button4.Enabled = true;
else
Button4.Enabled = false;
}
else
{
//로그인X
Button1.Visible = true;
Button2.Visible = false;
Label1.Visible = false;
Label2.Visible = false;
//Button3.Enabled = false;
//Button4.Enabled = false;
Button3.Visible = false;
Button4.Visible = false;
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Response.Redirect("Login.aspx");
}
protected void Button2_Click(object sender, EventArgs e)
{
//로그 아웃
//Response.Cookies["_Auth"].Expires = DateTime.MinValue;
System.Web.Security.FormsAuthentication.SignOut();
Response.Redirect("Default.aspx");
}
}
Member
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Member.aspx.cs" Inherits="Member_Member" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h2>
Member.aspx<br />
<br />
<br />
로그인을 한 유저만 접근이 가능한 페이지!!</h2>
<br />
<br />
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Member_Member : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//로그인 유무?
if (!User.Identity.IsAuthenticated)
{
string script = @"<html><body><script type='text/javascript'>
alert('로그인 후 접근 가능!!');
history.back();
</script></body></html>";
Response.Write(script);
Response.End();
}
}
}