微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

“用户登录”期间的密码更改 Orchard CMS 工作流在工作流完成并进行身份验证时不会反映出来

如何解决“用户登录”期间的密码更改 Orchard CMS 工作流在工作流完成并进行身份验证时不会反映出来

在工作流程中更新用户密码时遇到一些问题,第一个状态是“用户登录”。我使用的是 Orchard CMS 1.10.2。

让我稍微解释一下这个场景。我已经设置了这个工作流,我希望用户首先通过我在工作流中使用 HTTPRequest 活动调用的外部 Web 服务进行身份验证。如果成功并且是用户第一次登录 Orchard 站点,则用户将在 Orchard 中创建。如果用户认证成功并且已经存在于 Orchard 中,则工作流程将继续并继续执行 Orchard 的用户认证程序。我有一个场景,用户在外部系统中更改了密码,但旧密码保留在 Orchard 中。我想在用户通过 HTTPRequest 活动的工作流中的外部网络服务成功通过身份验证后更新 Orchard 中的密码。

以下是“logon”操作,包含在 Orchard.Users 的 AccountController 中的 Orchard CMS 源代码中:


[HttpPost]
[AlwaysAccessible]
[ValidateInput(false)]
[SuppressMessage("Microsoft.Design","CA1054:UriParameteRSShouldNotBeStrings",Justification = "Needs to take same parameter type as Controller.Redirect()")]
public ActionResult logon(string userNameOrEmail,string password,string returnUrl,bool rememberMe = false) {
    _userEventHandler.LoggingIn(userNameOrEmail,password);

    var user = Validatelogon(userNameOrEmail,password);
    if (!ModelState.IsValid) {
        var shape = _orchardServices.New.logon().Title(T("Log On").Text);
        return new ShapeResult(this,shape); 
    }

    _authenticationService.SignIn(user,rememberMe);
    _userEventHandler.LoggedIn(user);

    return this.RedirectLocal(returnUrl);
}

我的理解是,一旦执行了 _userEventHandler.LoggingIn(userNameOrEmail,password); 行,就会启动带有“用户登录”的工作流。在 Workflow 中,启动了一个 HTTPRequest Activity,它执行以下代码

[HttpPost]
public void ExternalWebServiceAuthentication(string p_UserName,string p_Password)
{
    //A webservice is called and authenticates the provided username and password
    var authenticated = externalWS.Authenticate(p_Username,p_Password);
    if (authenticated)
    {
        var actUser = _membershipService.GetUser(p_UserName);
        if (actUser != null)
        {
            _membershipService.SetPassword(actUser,p_Password);
        }
    }
}

密码修改成功,没有收到错误信息。为确保这一点,我检查了“actUser”变量中的密码和盐值,更改已受到影响。到目前为止一切顺利。

回到上面提到的“logon函数,执行的下一行是var user = Validatelogon(userNameOrEmail,password);。尽管在 HTTPRequest Activity 中成功更改了密码,但似乎在 Validatelogon 函数中对用户名/密码进行身份验证时,它使用了旧存储的用户密码,从而导致身份验证错误

基本上总结一下,调用 Validatelogon(userNameOrEmail,password); 时似乎没有反映在 Workflow 中对密码所做的更改。请记住,当 Orchard 中的身份验证第一次失败时,当我再次尝试登录时,它按预期工作,这意味着它似乎第二次检索到更改后的密码。

会不会是对密码的修改还没有提交到数据库?有没有办法在退出工作流之前强制刷新对用户密码所做的更改?有没有办法强制 Validatelogon(userNameOrEmail,password); 始终获取最新密码?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?