如何处理;“记住我”;在Asp.Net成员资格提供程序中
我为我的ASP.Net网站编写了一个自定义成员资格提供程序 我使用默认的Forms.Authentication重定向,您只需将true传递给方法,告诉它为当前用户“记住我” 我假设这个函数只是将一个cookie写入本地机器,其中包含用户的一些登录凭证 ASP.Net在这个cookie中放了什么?如果我的用户名的格式是已知的(例如顺序编号),有人可以轻松复制此cookie,并将其放在自己的机器上,以另一个用户的身份访问该站点,是否可能 此外,我需要能够接受拥有cookie的用户的身份验证。由于他们上次登录帐户时可能已被取消,他们可能需要更改密码等,因此我需要拦截身份验证的选项,如果一切正常,允许他们继续或将他们重定向到正确的登录页面 对于这两点,我将非常感谢您的指导。我收集了第二个我可能在global.asax中放置一些东西来拦截身份验证如何处理;“记住我”;在Asp.Net成员资格提供程序中,asp.net,cookies,forms-authentication,membership,remember-me,Asp.net,Cookies,Forms Authentication,Membership,Remember Me,我为我的ASP.Net网站编写了一个自定义成员资格提供程序 我使用默认的Forms.Authentication重定向,您只需将true传递给方法,告诉它为当前用户“记住我” 我假设这个函数只是将一个cookie写入本地机器,其中包含用户的一些登录凭证 ASP.Net在这个cookie中放了什么?如果我的用户名的格式是已知的(例如顺序编号),有人可以轻松复制此cookie,并将其放在自己的机器上,以另一个用户的身份访问该站点,是否可能 此外,我需要能够接受拥有cookie的用户的身份验证。由于他
提前感谢。形式认证和会员资格提供商是两件完全不同的事情,但它们之间的合作非常好。如果您编写了一个持久cookie[“记住我”],那么下次,您只需调用
Membership.GetUser()
,它将返回当前登录用户的MembershipUser
实例,或者如果没有用户登录,则返回null
所以,当用户第一次到达并使用“记住我”进行身份验证时,您应该编写一个持久cookie,如下所示
FormsAuthentication.RedirectFromLoginPage(strUserName, true);
假设用户不注销并离开网页,过一段时间再回来。您只需按如下方式调用MembershipUser.GetUser(),并检查该用户是否已从FormsAuthentication编写的持久cookie中登录
MembershipUser someUser = Membership.GetUser();
if(someUser == null)
{
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
}
else
{
//Take where logged in users go.
}
您可以在登录页面本身或主登录页面上执行此检查,以拦截用户帐户,以检查他是否需要更改密码,或者帐户是否如您的情况一样被禁用
编辑
有两种方法可以做到这一点
1.)在global.asax中的Session_Start event中检查上述身份验证,并设置一个会话密钥,该密钥在该特定会话的所有页面上都可用
2.)另一种方法是保留从System.Web.UI.Page继承的通用应用程序范围的通用页面基类,并充当所有asp.net页面的基类。在公共PageBase类的页面加载上,如上所述检查身份验证。在这种情况下,您必须小心地编写条件重定向,因为这可能会导致无限重定向,因为它将在公共PageBase类的所有页面的页面加载上运行
public class PageBase : System.Web.UI.Page
{
/// <summary>
/// Initializes a new instance of the Page class.
/// </summary>
public Page()
{
this.Load += new EventHandler(this.Page_Load);
}
private void Page_Load(object sender, EventArgs e)
{
try
{
AuthenticateUser();
}
catch
{
//handle the situation gracefully.
}
}
private AuthenticateUser()
{
MembershipUser someUser = Membership.GetUser();
if(someUser == null)
{
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
}
else
{
//Take where logged in users go.
}
}
}
//in your asp.net page code-behind
public partial class contact : PageBase
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
公共类PageBase:System.Web.UI.Page
{
///
///初始化Page类的新实例。
///
公共网页()
{
this.Load+=新事件处理程序(this.Page\u Load);
}
私有无效页面加载(对象发送方,事件参数e)
{
尝试
{
AuthenticateUser();
}
抓住
{
//优雅地处理这种情况。
}
}
私人验证器()
{
MembershipUser-someUser=Membership.GetUser();
if(someUser==null)
{
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
}
其他的
{
//获取登录用户的位置。
}
}
}
//在asp.net页面中隐藏代码
公共部分类联系人:PageBase
{
受保护的无效页面加载(对象发送方、事件参数e)
{
}
}
对我来说,解决方案是区分浏览器会话身份验证cookie(不要与asp.net会话cookie混淆)而持久的一-设置低过期将创建一个持久的cookie,这意味着当浏览器在过期时间内关闭并重新打开时,它会被记住。以下是我的作品:
public void SetAuthenticationCookie(LoginView loginModel)
{
if (!loginModel.RememberMe)
{
FormsAuthentication.SetAuthCookie(loginModel.Email, false);
return;
}
const int timeout = 2880; // Timeout is in minutes, 525600 = 365 days; 1 day = 1440.
var ticket = new FormsAuthenticationTicket(loginModel.Email, loginModel.RememberMe, timeout);
//ticket.
string encrypted = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted)
{
Expires = System.DateTime.Now.AddMinutes(timeout),
HttpOnly = true
};
HttpContext.Current.Response.Cookies.Add(cookie);
}
谢谢你的回复。当用户返回应用程序时,他们可以在任何页面上登陆,因此我需要某种方法来全局处理此问题。然后我可以检查帐户是否仍然有效等。