0

我正在为 Umbraco 8 中的用户实施 2FA,在登录后但在输入代码之前,我需要进行一些检查。对于此检查,我需要知道哪个用户已登录,但我无法弄清楚如何才能知道哪个用户已登录。

用户在后台登录后,我显示了一个 html 模板,这可以通过这行代码实现:

public string GetTwoFactorView(IOwinContext owinContext, UmbracoContext umbracoContext, string username) =>
        PackageConstants.PathToMfaHtmlTemplate;

该模板链接到一个 angularjs 控制器:

<div ng-controller="mfaLoginController" class="umb-login-container">
  //...
</div>

在我的控制器中,我可以访问服务:

userService
authResource

但两者似乎都没有用户数据。我可以在这里注入其他服务来为我提供用户数据吗?

我需要从这个控制器对 Umbraco API 进行 API 调用:

[IsBackOffice, PluginController("LoginMfa")]
public class MfaLoginApiController : UmbracoApiController
{
     //...
}

在一个端点中,我设法使用下一行代码检索了 OWIN TwoFactorCookie:

var mfaCookie = Request.Headers.GetCookies(".AspNet.UmbracoTwoFactorCookie").FirstOrDefault()
                .Cookies.FirstOrDefault(cookie => cookie.Name == ".AspNet.UmbracoTwoFactorCookie").Value;

这将返回一个看起来像加密的字符串。如果它完全存储在这个cookie中,有没有办法解密这个字符串并从这个cookie中获取用户数据(用户ID就足够了)?

或者此时是否有更好的方法来检索用户?

4

1 回答 1

0

我想到了。在为我的问题调查可能的不同解决方案时,我在 Umbraco 的 AuthenticatorController 中看到了下一个代码(非常好,它是开源的):

private BackOfficeSignInManager _signInManager;

private BackOfficeSignInManager SignInManager => _signInManager ?? (_signInManager = TryGetOwinContext().Result.GetBackOfficeSignInManager());

幸运的是,我也可以在我的 API 控制器中使用这段代码,这行代码给了我我需要的东西。

var userId = await SignInManager.GetVerifiedUserIdAsync();
于 2020-07-30T15:02:03.817 回答