C# 如何强制用户在首次登录后更改密码?

C# 如何强制用户在首次登录后更改密码?,c#,asp.net,redirect,login,change-password,C#,Asp.net,Redirect,Login,Change Password,我想强制用户在第一次登录后更改密码。现在,我应该把重定向代码放在哪里更改密码页面 如果我把它放在默认页面的页面加载,用户可以移动到任何页面,因为他已通过身份验证 如果我把它放在母版页的Page\u Load,ChangePassword页面使用相同的母版页,它将进入无限重定向循环 如果页面是母版页中的ChagePassword页面,我会忽略重定向,我找到的答案是: 这听起来是个坏主意。母版的想法是,它不应该关心有什么页面,因为这是每个页面的所有通用代码 任何建议 您可以处理登录控件的以下事

我想强制用户在第一次登录后更改密码。现在,我应该把重定向代码放在哪里更改密码页面

  • 如果我把它放在默认页面的
    页面加载
    ,用户可以移动到任何页面,因为他已通过身份验证
  • 如果我把它放在母版页的
    Page\u Load
    ,ChangePassword页面使用相同的母版页,它将进入无限重定向循环

    如果
    页面
    是母版页中的ChagePassword页面,我会忽略重定向,我找到的答案是:

    这听起来是个坏主意。母版的想法是,它不应该关心有什么页面,因为这是每个页面的所有通用代码


任何建议

您可以处理登录控件的以下事件

•LoggedIn •登录


祝你好运,我希望这会有所帮助。

你可以在GLobal.asax文件中完成

检查登录的用户和请求url是否为ChangePassword,然后重定向到ChangePassword页面

/// <summary>
/// this event occurs just after user is authenticated
/// </summary>
void Application_AuthorizeRequest(object sender, EventArgs e)
{
    // check if user is authenticated
    if (User.Identity.IsAuthenticated)
    {
        // checking page extension
        switch (System.IO.Path.GetExtension(Context.Request.Url.AbsoluteUri.ToLower()))
        {
            case ".bmp":
            case ".gif":
            case ".jpg":
            case ".jpe":
            case ".jpeg":
            case ".png":
            case ".css":
            case ".js":
            case ".txt":
            case ".swf":
                // don't redirect, these requests may required in many cases
                break;
            default:
                // checking if request is not for ChangePassword.aspx page
                if (!Context.Request.Url.AbsoluteUri.ToLower().Contains("/changepassword.aspx"))
                {
                    Context.Response.Redirect("~/ChangePassword.aspx");
                }
                break;
        }
    }
}
//
///此事件发生在用户通过身份验证之后
/// 
无效应用程序请求(对象发送方,事件参数e)
{
//检查用户是否经过身份验证
if(User.Identity.IsAuthenticated)
{
//检查页面扩展名
开关(System.IO.Path.GetExtension(Context.Request.Url.AbsoluteUri.ToLower())
{
大小写“.bmp”:
大小写“.gif”:
案例“.jpg”:
案例“.jpe”:
大小写“.jpeg”:
案例“.png”:
case“.css”:
案例“.js”:
案例“.txt”:
案例“.swf”:
//不要重定向,在许多情况下可能需要这些请求
打破
违约:
//检查请求是否不是针对ChangePassword.aspx页面
如果(!Context.Request.Url.AbsoluteUri.ToLower()包含(“/changepassword.aspx”))
{
Redirect(“~/ChangePassword.aspx”);
}
打破
}
}
}

据我所知,您应该将验证代码放在“Page\u PreRender”中


此事件将在页面呈现任何内容之前触发代码

为了评估用户是否经过身份验证,您将哪个对象放入节中?我只需要设置一个名为“ChangePasswordOnNextLoggin”的布尔属性,然后如果它为真,我将重定向到“ChangePassword.aspx”,您可以将它放在任何您想要的地方(即使在母版页中,因为只有当此属性为真时才重定向,避免了无限循环)


但就我个人而言,我会为PAGE对象创建一个包装器,每个.aspx代码隐藏类都应该继承,然后我会继承这个包装器,在包装器上,我会向Load事件添加一个Authenticate方法,这样它将是加载任何页面时调用的第一个方法。如果我这样做,我就能够避免将验证代码放在母版页上,而代码被隐藏,从而使代码更干净。你明白了吗

我们有一个要求类似的应用程序。我们扩展了基本ASP.NET成员资格提供程序,以允许检查LastPasswordChangedDate,并将其与CreateDate进行比较。如果相等,则表示用户从未更改过密码,并被重定向到登录页面


我知道你想进行某种检查,以便在登录后继续监听他们。我认为您可以在Global.asax的授权请求中实现这一点。但是这可能会很昂贵。

在用户进行身份验证的代码位置。

因为您希望用户在第一次登录时更改密码,所以注册后,您只需在数据库的登录表中创建一个字段,该字段将具有状态值,无论初始pasword更改过程是否完成。因此,当用户第一次登录时,将检查该值,如果该值类似于“unchanged”,则将用户从登录页面重定向到更改密码页面。成功更改密码后,更新字段。

在SQL Server 2005(加上VS2008)中,除了所有“添加一个更多字段”的方法外,我认为执行asp.net安全数据库的内置存储过程
aspnet\u Membership\u FindUsersByName
要容易得多。它返回一个数据集,其中包含您需要的所有信息,包括上次活动日期、上次密码更改日期、上次登录日期等以及时间值。

这是一个经过全面测试的解决方案;)


有趣的问题。如果将此功能添加到ASP.NET web安全模块中,那就太好了。我想我会为我的页面(避免在母版中执行此操作)和OnInit中创建一个基类:if(auth&&!User.HasChangedPassword&&typeof(Page)!=typeof(ChangePasswordPage))Response.Redirect(。。。(我没有尝试测试的类型,但是如果request.url不起作用,您可以测试它)问题是,用户已经过身份验证,所以他可以移动到任何地方。好的,我明白了。你的意思是,如果他在更改密码之前移动,那么你应该将其放在母版页的页面加载中,并检查请求。Url,如果不是更改密码页面Url,那么你重定向,从而打破了递归。你在你的电话?当页面尝试更新数据库或类似的内容时会发生什么情况,并且在页面生命周期的早期出现故障?用户永远不会知道,因为他们将被发送到ChangePassword页面。稍微修改版本以说明db保存时间
var timeSpan=user.LastPasswordChangedDate-user.CreationDate;
如果(timeSpan.Minutes<1)
这会阻止直接访问应用程序资源吗?@Filip,不会,因为它本身的优点,这不是一个很好的建议;)如果用户
protected void Page_PreRender(object sender, EventArgs e)
{
     //Validation Code       
}
protected void LoginButton_Click(object sender, EventArgs e)
{
    /****note: UserName and Password are textbox fields****/

    if (Membership.ValidateUser(UserName.Text, Password.Text))
    {
        MembershipUser user = Membership.GetUser(UserName.Text);
        if (user == null)
        {
           FailureText.Text = "Invalid username. Please try again.";
           return;
        }
        if (user.IsLockedOut)
           user.UnlockUser();

        /* this is the interesting part for you */
        if (user.LastPasswordChangedDate == user.CreationDate) //if true, that means user never changed their password before
        {
            //TODO: add your change password logic here
        }
    }
}