今天一个朋友(网友)初学.net的,问了我一个问题,他说想做一个用户登录的页面,看到Asp.net控件里面有个LoginView的控件,问我会不会用。我说会,然后他让我写一个Demo给他,让他学习下。
早上,因为忙碌,所以就没写了,让他自己找资料先学下,现在我就写个Demo,希望想学的人会有帮助。
创建一个WebSite,新建一个页面命名为SignIn.aspx,然后在页面中添加如下的代码,或者你可以直接拖控件到页面,不过我习惯了写代码了
Code
<asp:LoginView ID="loginView" runat="server">
<AnonymousTemplate>
<asp:Login ID="login" runat="server" OnAuthenticate="login_OnAuthenticate">
<LayoutTemplate>
<div id="loginForm">
<h3>
Sign In</h3>
<div class="lrow clear">
<asp:Label runat="server" ID="UserNameLabel" CssClass="label" AssociatedControlID="UserName">User ID:</asp:Label>
<asp:TextBox runat="server" ID="UserName" CssClass="textbox" AccessKey="u" />
<asp:RequiredFieldValidator runat="server" ID="UserNameRequired" ControlToValidate="UserName"
ValidationGroup="Login1" ErrorMessage="User Name is required." ToolTip="User Name is required.">*</asp:RequiredFieldValidator>
</div>
<div class="lrow clear">
<asp:Label runat="server" ID="PasswordLabel" CssClass="label" AssociatedControlID="Password">Password:</asp:Label>
<asp:TextBox runat="server" Text="cookie" ID="Password" TextMode="Password" CssClass="textbox"
AccessKey="p" />
<asp:RequiredFieldValidator runat="server" ID="PasswordRequired" ControlToValidate="Password"
ValidationGroup="Login1" ToolTip="Password is required.">*</asp:RequiredFieldValidator>
</div>
<div class="lrow clear">
<asp:Button runat="server" ID="LoginButton" CommandName="Login" CssClass="lbutton"
Text="Sign in" />
<a href="Register.aspx" title="Register">Register?</a>
</div>
<p>
<asp:Literal runat="server" ID="FailureText" EnableViewState="False"></asp:Literal>
<asp:ValidationSummary ID="validateSummary" runat="server" ValidationGroup="Group1"
HeaderText="Login Error!" />
</p>
</div>
</LayoutTemplate>
</asp:Login>
</AnonymousTemplate>
<LoggedInTemplate>
<asp:LinkButton ID="btnLogout" runat="server" Text="Log out" OnClick="btnLogout_Click"></asp:LinkButton>
</LoggedInTemplate>
</asp:LoginView>
在LoginView控件里面 AnonymousTemplate 是用户没登录时候显示的内容, LoggedInTemplate 是用户登录后显示的内容,还有一个 RoleGroups 是控制角色相关的,这里就没了,因为不用;然后在AnonymousTemplate 里面设计登录asp:Login的Layout,好了代码就上面贴出来的。
Login控件有一个 OnAuthenticate 事件,那是在我们点击LoginButton的时候触发Command="Login"的事件
接下来我们写login_OnAuthenticate事件
Code
protected void login_OnAuthenticate(object sender, AuthenticateEventArgs e)
{
string username = ((Login)sender).UserName; // 取登录名
string password = ((Login)sender).Password; //取登录密码
if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password))
{
return;
}
if (TrySignIn(username, password)) // 尝试登录
{
string returnUrl = Request.QueryString["returnUrl"];
if (string.IsNullOrEmpty(returnUrl))
returnUrl = "~/Default.aspx";
Response.Redirect(returnUrl);
}
}
TrySignIn方法的实现,这里如果用户名不是"admin" 密码不是 "123" 则登录失败
Code
public static bool TrySignIn(string userName, string password)
{
if((userName != "admin") && (password != "123"))
return false;
HttpContext.Current.Session.Abandon();
FormsAuthenticationTicket t = new FormsAuthenticationTicket(1, user.UserRefId,
DateTime.Now, DateTime.Now.AddMonths(3),
false, user.UserRefId,
FormsAuthentication.FormsCookiePath);
string encTicket = FormsAuthentication.Encrypt(t);
HttpCookie c = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
HttpContext.Current.Response.Cookies.Add(c);
return true;
}
退出登录的方法
Code
public static void SignOut()
{
FormsAuthentication.SignOut();
HttpContext.Current.Session.Abandon();
HttpContext.Current.Request.Cookies.Clear();
}
这样,登录功能算是实现了,但是还不能正确运行起来,登录界面没有显示出来,因为Form认证的设置还没实现
打开Web.config文件,然后找到<authentication mode="Windows" ></authentication>节点,修改为
Code
<authentication mode="Forms" >
<forms defaultUrl="~/Default.aspx" name=".Auth" protection="All" loginUrl="~/SignIn.aspx" path="/"></forms>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
现在你可以运行下,登录界面是出来了,但是样式没有了,首页也需要登录,这样不对,还需要设置首页和样式文件不需要进行认证,我们找到</system.web>,在它后面添加如下设置
Code
<location path="Default.aspx">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
<location path="App_Themes">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
现在,我们运行下项目,Ok,安静了...
附:源代码