我们在ASP.NET中有一个自定义的MembershipProvider。现在有两种可能的情况可以验证用户:
通过login.aspx页面输入用户名/密码登录。我已经使用了登录控件并将其与MyMembershipProvider链接。这工作得很好。
身份验证令牌通过查询URL中的某些URL从其他网站传递。为此,我在MembershipProvider.Validate(string authenticationToken)中有一个重载,它实际上是在验证用户。在这种情况下,我们不能使用登录控件。现在,如何在不实际使用登录控件的情况下使用相同的MembershipProvider来验证用户?我尝试手动调用Validate,但这未使用户登录。
这是我正在使用的代码段
1 2 3 4 5 6 7 8 9 10
| if (!string.IsNullOrEmpty(Request.QueryString["authenticationToken"])) {
string ticket = Request.QueryString["authenticationToken"];
MyMembershipProvider provider = Membership.Provider as MyMembershipProvider;
if (provider != null) {
if (provider.ValidateUser(ticket))
// Login Success
else
// Login Fail
}
} |
验证成功后,您需要通过调用FormsAuthentication.Authenticate登录用户:http://msdn.microsoft.com/zh-cn/library/system.web.security.formsauthentication.authenticate.aspx <铅>
编辑:这是FormsAuthentication.SetAuthCookie:
http://msdn.microsoft.com/zh-CN/library/twk5762b.aspx
此外,要将用户重定向到他想去的地方,请致电:FormsAuthentication.RedirectFromLoginPage:http://msdn.microsoft.com/zh-cn/library/system.web.security.formsauthentication.redirectfromloginpage.aspx <铅>
链接文字
如果验证成功,则可以设置自己的FormsAuthenticationTicket。
像这样的东西;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| if (provider != null) {
if (provider.ValidateUser(ticket)) {
// Login Success
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
1, //version
someUserName, //name
DateTime.Now, //issue date
DateTime.Now.AddMinutes(lengthOfSession), //expiration
false, // persistence of login
FormsAuthentication.FormsCookiePath
);
//encrypt the ticket
string hash = FormsAuthentication.Encrypt(authTicket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash);
Response.Cookies.Add(cookie);
Response.Redirect(url where you want the user to land);
} else {
// Login Fail
}
} |
在将身份验证信息直接存储为cookie的情况下,您是正确的。但是使用强大的哈希函数(例如MD5 SHA1)既安全又好用。
顺便说一句,如果您使用会话(也只是一个哈希cookie),则可以向其附加身份验证信息。