Asp.net 使用AdMembership Provider在下次登录时更改表单登录的密码

Asp.net 使用AdMembership Provider在下次登录时更改表单登录的密码,asp.net,active-directory,forms-authentication,change-password,Asp.net,Active Directory,Forms Authentication,Change Password,我正在做asp.net,使用AdMembership proivder的FormsAuthentication 我必须手动编写“下次登录时更改密码”屏幕,因为提供程序不支持该屏幕 我呼吁: if (Membership.Provider.ChangePassword(cpCv.LoginName, cpCv.OldPassword, cpCv.NewPassword)) 验证用户并更改密码(但不清除“下次登录时”标志) 但它总是失败, (我假设在设置“下次登录时更改密码标志”时,成员身份验证失

我正在做asp.net,使用AdMembership proivder的FormsAuthentication

我必须手动编写“下次登录时更改密码”屏幕,因为提供程序不支持该屏幕

我呼吁:

if (Membership.Provider.ChangePassword(cpCv.LoginName, cpCv.OldPassword, cpCv.NewPassword))
验证用户并更改密码(但不清除“下次登录时”标志)

但它总是失败, (我假设在设置“下次登录时更改密码标志”时,成员身份验证失败。)

验证用户的最简单方法是什么,以便在重置密码和清除“下次登录时”标志之前确保“旧密码”和“用户名”匹配

我有重置密码和清除标志的功能,是验证让我卡住了

还尝试了这段代码,如果重置标志为false,它将登录,如果为true,它将无法登录

    DirectoryEntry de = new DirectoryEntry( path, "jcsn\\"+AdUserName, AdPassword );

    try
    {
        //Bind to the native AdsObject to force authentication.
        object obj = de.NativeObject;

        DirectorySearcher search = new DirectorySearcher( de );

        search.Filter = "(SAMAccountName=" + AdUserName + ")";
        search.PropertiesToLoad.Add( "cn" );
        SearchResult result = search.FindOne();

        if ( null == result )
        {
            return false;
        }

    }
    catch ( Exception ex )
    {
        throw new Exception( "Error authenticating user. " + ex.Message );
    }
谢谢


Eric-

有一个名为Membership.Validate的函数。我认为您的代码如下所示:

if(Membership.ValidateUser(txtUserName.Text, txtPassword.Text)) 
{   
    //Proceed with the change 
}

我不知道为什么您对ChangePassword的调用失败了--我认为ChangePassword可能会调用ValidateUser。

虽然这是一个旧线程,但似乎没有得到响应

在中,当系统管理员检查了“用户下次登录时必须更改密码”的帐户选项时,开发人员以成员身份与Microsoft联系。ValidateUser()返回false

ActiveDirectoryMembershipProvider不允许具有 “用户下次登录时必须更改密码…”标志设置为登录。 根据微软的说法,这是故意的:因为 ActiveDirectoryMembershipProvider未提供强制的机制 用户在登录时提供新密码,身份验证被阻止

他们接着给出了一个提示,他们在FormsAuthentication中使用了安全API,但没有提供示例


有人有什么想法吗?

if(Membership.ValidateUser(txtsername.Text,txtPassword.Text))也返回false。。我认为更改密码失败是因为它调用了ValidateUser,而ValidateUser失败是因为AdMembershipProvider不支持changePasswordOnNextLogon,并且失败了。我想我需要一种不使用提供程序的身份验证方法。ChangePAssword调用validate user,validate user在重置为true时失败,这就是AdMembershipProvider的实现方式。因此,整个方法都不适用。对于您的问题,我没有一个真正的解决方案,但是看看System.DirectoryServices.AccountManagement命名空间,它可能允许您减少代码量,并可能为您提供修复方案。谢谢!我刚刚发布了另一个问题,因为我尝试使用该名称空间,但在身份验证方面遇到了困难。我希望它会有帮助,因为它可以很容易地清除标志,然后重置它。