首页 > 解决方案 > 通过 API 将 .Net Core Identity 与多个 .Net Core Web 应用程序一起使用?

问题描述

我目前在一个解决方案中有两个 Web 项目(以及各种类库)。

Web 项目 1 已将 Identity 配置为通过 Web api 登录:

[HttpPost]
    public async Task<IActionResult> Login([FromBody] LoginModel loginModel)
    {
        var res = await _authService.LoginAsync(loginModel.Username, loginModel.Password, loginModel.Persist);
        var data = new APIResult(res, _authService.CurrentErrors);
        return Ok(data);
    }

_authService.LoginAsync() 最终使用 _signInManager.PasswordSignInAsync() 使用身份登录。

使用 Swagger 进行测试,用户已登录,我可以使用 IHttpContextAccessor 访问它,一切正常。

Web 项目 2 是一个 .Net Core Web 应用程序,仅提供视图服务,这些视图具有从 Web 项目 1 调用 API 的 javascript。在登录的情况下,如下所示:

$("#loginBtn").click(function () {
    startLoginBtnLoading();
    var loginModel = {
        Username: $("#loginUsernameTxt").val(),
        Password: $("#loginPasswordTxt").val(),
        Persist: $("#loginPersistChk").is(":checked")
    };
    $.ajax({
        type: 'POST',
        url: '@AuthUrl.LoginUrl',
        contentType: 'application/json; charset=UTF-8',
        data: JSON.stringify(loginModel),
        success: function (result) {
            if (result.success) {
                toastr.success("Login was successful.", "Success");
                $("#loginModal").modal('hide');
                $.event.trigger({ type: "login", time: new Date() });
            }
            else {
                $.each(result.errors, function (ix, ob) {
                    toastr.error(ob, "Error");
                });
            }
            endLoginBtnLoading();
        }
    });
});

这成功调用了我的 API 并允许登录(因为我已将 CORS 设置为允许一切)。但是,HttpContext 不会在 API 调用之间停留,所以当我下次调用我的 API 并检查 HttpContext.User 时,我不再经过身份验证。

我对如何通过 API 登录并在下次调用 API 时保持会话而不将其移动到同一个项目中感到有些不知所措?

标签: c#asp.net-core

解决方案


这不可能。

您正在从客户端调用登录服务。第一个登录 API 将帮助用户登录,它会在第一个应用程序中生成 HTTP 上下文。

请注意,会话状态是一种服务器端状态存储机制。

身份验证后,登录 API 可能会发送一个 cookie(未在您的代码中显示)。该 cookie 或该 cookie 中的某种令牌用于识别与该用户对应的服务器端会话状态。

由您的登录 API 编写的 cookie 将包含一些提到的 URL,这些 cookie 可以通过这些 URL 发送。

因此,首先,浏览器可能不会将该 cookie 发送到您的第二个 API。

即使您明确地传递它,因为会话状态是服务器端存储,而 cookie 正在从执行登录的服务器识别会话状态。

解决此问题的一种方法是 - 使用 OWIN/OIDC/OAuth 并让您的身份服务器执行您的登录操作。如果您使用它,它将负责为需要登录的 API 生成和填充服务器端状态。

我希望这有帮助。

编辑:您可以参考此博客,其中说明如何使用 OWIN 创建身份验证 API。


推荐阅读