【发布时间】:2019-01-19 04:05:03
【问题描述】:
我目前在一个解决方案中拥有两个 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() 使用 Identity 登录。
使用 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 时保持会话而不将其移动到同一个项目中?
【问题讨论】:
-
您应该查看单点登录解决方案,该解决方案可让您使用相同的登录名登录多个应用程序。 Identity Server 4 是 Microsoft 推荐的。然后您将拥有一个授权服务器应用程序,并且您的两个 MVC 应用程序通过同一台服务器进行身份验证。
标签: c# asp.net-core