如何在 MVC 项目中使用 .NET 和 Angular 5

How to use .NET with Angular 5 in a MVC project

我正在使用 .NET Core 2.0 Angular 5. 我需要有关使用该技术的信息。 在单个项目 MVC 中使用 Angular 前端和 .NET Core 后端是否可行,使用 Angular CLI 和 dotnet CLI?我做了实验,结果很好,但是,我在 .NEt 中的控制器以及您与前面的 Angular 的连接有问题。

我有这个架构:

我使用隐式流程进行身份验证,所以在 mi SPA 中我有一个登录按钮,当单击该按钮时,SPA 会向 AuthServer 发送请求并重定向到 auth.myapp.com。在这个地方,用户输入你的凭证(用户名和密码),authserver 实现逻辑,生成一个令牌并使用 access_token 重定向到我的 SPA。这是 OpenID 的隐式流程。

首先,我在 .NET 中有一个名为 "Login" 的 HttpGET 控制器。这个控制器接收一个字符串 "returnURL" 并且应该在 ViewModel 中返​​回这个 returnURL 以用于 Razor 视图,但是我不使用 Razor 而使用 Angular。这是我的第一个问题。在 mi 客户端 SPA (admin.myapp.com) 中,我有一个按钮 "sign in",当我单击此按钮时,这实现了对我的 auth 服务器的请求,并且此端点应该提取 returlURL 和 return 到 Angular 的登录页面。

在剃刀中:

return View(vm);

这是 returnURL 收到的 URL 参数,因为 admin.myappp.com 到 auth.myapp.com (localhost:5000):

如何在Angular中使用?我需要 return 这个 ViewModel(包含 returnURL 的信息)并在登录请求 (HttpPost) 中使用。 我在想,删除登录的 GET 端点并通过 Angular 路由器执行 returnURL 的 "capture" 可能是更好的选择,并且一旦你有了这个字符串,如果你通过 POST 向端点登录发出请求以执行身份验证,然后通过 .NET 驱动程序使用访问令牌重定向到我的 SPA。哪个是最好的选择?无论哪个是最好的选择,我推理的最后一部分都会导致以下问题:

其次,我有一个控制器用于在 MVC 应用程序中实现登录,在域 auth.myapp.com 中,这个 HttpPOST 控制器接收一个包含登录信息的模型(用户名、密码和returnURl(来自之前的 ViewModel)),此模型是从连接 .NET 控制器的服务 Angular 接收的,如果结果为正,则应重定向到其他 SPA在其他外部主机中,例如:admin.myapp.com,在 SPA 中使用 access_token。 我使用此代码:

[HttpPost]
public async Task<IActionResult> Login (LoginInputModel model) {
    if (ModelState.IsValid) {
        if (_usersStore.ValidateCredentials (model.Username, model.Password)) {
            var user = _usersStore.FindByUsername (model.Username);

            if (_interactionService.IsValidReturnUrl (model.ReturnUrl) || Url.IsLocalUrl (model.ReturnUrl)) {
                return Redirect(model.ReturnUrl);
            }
            return Redirect("~/");
        }
    }
    return Redirect("~/");
}

问题是 "return Redirect()" 在 angular 中找不到,在 Razor 中找到了,如何在前端中使用 Angular 重定向自 .NET 控制器?

这是 OpenID 身份验证的隐式流程,使用 IdentityServer4 实现。

总结是不推荐的方法,您应该将 IS4 与客户端和 Api 分开。更多安全控制到位。

我之前在这里查看过相同的查询: