Forms认证实战
最近在升级一款软件产品,原来是交给一个外包公司做的,质量的方面不做评论。唯一觉得不是很好的是认证方式
没错,用的是基本身份验证,也就是说每次登录要弹出一个巨丑无比的窗口,然后填上Windows的账号登录。如果作为一个内部应用,丑点也就算了,但毕竟这是一款未来将要商用的软件,难道要给每个客户开通一个服务器端的Windows账号吗?这恐怕不太可行。并且涉及到账号权限、过期时间等一系列可扩展的行为将无法或很难实现。所以我就改成了这样
各位看官一看就明白了,我把认证方式改成了Forms认证。这样我们就可以结合Forms认证来进行账号管理、权限等等一系列扩展行为。下面说一下实现吧
一、首先是配置文件,
在Web.config的System.Web节点中增加如下配置
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="login.aspx" defaultUrl="/" protection="All" timeout="700" path="/" requireSSL="false" slidingExpiration="true" cookieless="UseDeviceProfile" domain="eddy.peng.com" enableCrossAppRedirects="false">
<credentials passwordFormat="SHA1" />
</forms>
</authentication>
具体的属性含义我就不把MSDN的搬过来了,大家可以自行前往查看。需要注意的一点是,如果使用vs右键浏览然后附加进程的方式去debug程序,会发现不能包含“domain”属性的,否则你的调试将无法继续进行下去。
<machineKey validationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77" decryption="3DES" validation="SHA1" />
machineKey 这个配置是用来配合Forms认证进行cookie加密和解密使用的,如果不配置这个节点,那你的cookie就会明文存在客户端了。
二、配置文件配置好之后,就是写登录代码,然后再判断状态取出用户身份了,流程很清晰,现在把代码贴出来供大家参考
1、写cookie
/// <summary>
/// 用户登录
/// </summary>
/// <param name="userAccount">用户账号</param>
/// <param name="password">密码</param>
/// <returns>登录成功返回True</returns>
public static bool Login(string userAccount, string password)
{
bool result = false;password = Common.Encrypt(password);
using (***DataContext ndc = new ***DataContext())
{
var r = (from u in ndc.Users where u.UserName == userAccount && u.Password == password select u).ToList();if (r.Count > 0)
{
result = true;SetCookies(r[0].UserID, userAccount, r[0].RealName, Convert.ToInt32(r[0].IsAdmin));
}
}return result;
}/// <summary>
/// 设置用户Cookies
/// </summary>
/// <param name="userId">用户ID</param>
/// <param name="userAccount">用户账号</param>
/// <param name="realName">名称</param>
/// <param name="isAdmin">是否是管理员</param>
private static void SetCookies(int userId, string userAccount, string realName, int isAdmin )
{
string AuthCookieContent = string.Format("{0},{1},{2},{3}", userId, userAccount, realName, isAdmin);HttpContext.Current.Response.AddHeader("P3P", "CP=CAO PSA OUR");
FormsAuthentication.SetAuthCookie(AuthCookieContent, false);
}
2、在页面中判断状态,读取用户身份
if (HttpContext.Current.Request.IsAuthenticated)
{
LoginUser user = new LoginUser();string[] authCookies = HttpContext.Current.User.Identity.Name.Split(',');
user.Id = int.Parse(authCookies[0]);
user.Account = authCookies[1];
user.Name = authCookies[2];
user.Role = authCookies[3] == "0" ? UserRole.Common : UserRole.Admin;}
else
{
HttpContext hc = HttpContext.Current;hc.Response.Redirect("/login.aspx?returnurl=" + hc.Request.Url.AbsolutePath);
}
到此,告一段落。
这篇文章只是从实战的角度给大家一个示例,至于更深层次的知识和原理还需要大家通过其他途径获得。
OK,收工。