FormsAuthentication 和 MembershipProviders 是两个完全不同的东西,但它们仍然可以很好地相互配合。如果您已经编写了持久性 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 事件中检查身份验证,并设置一个会话密钥,该密钥在该特定会话的所有页面上都可用。
2.) 另一种方法是保留一个通用的应用程序范围的通用 PageBase 类,该类继承自 System.Web.UI.Page 并充当所有 asp.net 页面的基页面类。在通用 PageBase 类的 Page Load 上检查身份验证,如上所述。在这种情况下,您必须仔细编写条件重定向,因为这可能会导致无限重定向,因为它将在公共 PageBase 类的所有页面的 Page_Load 上运行。
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)
{
}
}