Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何处理;“记住我”;在Asp.Net成员资格提供程序中_Asp.net_Cookies_Forms Authentication_Membership_Remember Me - Fatal编程技术网

如何处理;“记住我”;在Asp.Net成员资格提供程序中

如何处理;“记住我”;在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的用户的身份验证。由于他

我为我的ASP.Net网站编写了一个自定义成员资格提供程序

我使用默认的Forms.Authentication重定向,您只需将true传递给方法,告诉它为当前用户“记住我”

我假设这个函数只是将一个cookie写入本地机器,其中包含用户的一些登录凭证

ASP.Net在这个cookie中放了什么?如果我的用户名的格式是已知的(例如顺序编号),有人可以轻松复制此cookie,并将其放在自己的机器上,以另一个用户的身份访问该站点,是否可能

此外,我需要能够接受拥有cookie的用户的身份验证。由于他们上次登录帐户时可能已被取消,他们可能需要更改密码等,因此我需要拦截身份验证的选项,如果一切正常,允许他们继续或将他们重定向到正确的登录页面

对于这两点,我将非常感谢您的指导。我收集了第二个我可能在global.asax中放置一些东西来拦截身份验证


提前感谢。

形式认证和会员资格提供商是两件完全不同的事情,但它们之间的合作非常好。如果您编写了一个持久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);
    }

谢谢你的回复。当用户返回应用程序时,他们可以在任何页面上登陆,因此我需要某种方法来全局处理此问题。然后我可以检查帐户是否仍然有效等。