ASP MVC 5 在不同域上运行 HTML5 客户端和 Web API 服务器

Posted

技术标签:

【中文标题】ASP MVC 5 在不同域上运行 HTML5 客户端和 Web API 服务器【英文标题】:ASP MVC 5 Running HTML5 Client and Web API server on different domains 【发布时间】:2013-12-03 18:17:18 【问题描述】:

我打算将我的 ASP.NET MVC5 项目拆分为 2 个项目。

第 1 部分:通过 EF6 等进行业务逻辑数据访问的 WEB API 服务器。

第 2 部分 ASP.NET MVC 5 客户端,带有 Razor 视图和对服务器的 JQuery Ajax 调用(不是纯单页应用程序 - SPA)

2 部分在不同的 IIS 服务器上运行。 SQL Server 不能(可能不能)直接从客户端访问

我可以从客户端获取凭据并将其传递给 web api 服务器以验证用户并获取令牌以访问服务器 api。

问题是:是否可以在客户端使用该服务器令牌进行身份验证和授权。

由于客户端没有本地用户数据库,因此没有用户角色或成员资格。

如何根据服务器端凭据授权某些客户端 MVC 剃须刀视图或控制器。

我是否必须在客户端实现一个自定义成员资格提供程序,通过 api 从服务器中提取用户角色等?

我知道会有跨域问题需要解决。

有什么想法吗?

提前致谢。

【问题讨论】:

【参考方案1】:

首先,客户端永远不能直接访问 SQL Server 实例,这就是 Web api/服务的重点。

就网络服务的身份验证而言,您需要使用访问令牌。当您构建一个新的 MVC 5 web api 项目时,如果您选择个人用户帐户身份验证,VS 将为您构建很多帐户信息。然后,您可以使用诸如控制哪些控制器和操作需要身份验证之类的属性。您甚至可以更细化并定义哪些角色可以访问某些控制器或操作。在客户端,它可能看起来像这样:

var login = function () 
   var url = "/Token";
   var data = $('formData').serialize();
   data = data + "&grant_type=password";
   $.post(url, data)
     .success(saveAccessToken);  //once the token is saved, it will need to appended to every request

   return false();


$('#login').click(login);

如果您正在考虑从控制器内部的服务器端进行身份验证,请使用WebClient Class 与 Web 服务进行交互,类似于上面的客户端脚本的方式。

最后,对于跨域问题。您应该查看Nuget Package。这个包将负责服务器端代码接受请求所需的大部分配置。有关 CORS 的一些背景知识,请查看 this site。希望对您有所帮助!

【讨论】:

以上是关于ASP MVC 5 在不同域上运行 HTML5 客户端和 Web API 服务器的主要内容,如果未能解决你的问题,请参考以下文章

如果项目已经在数据库中,请在视图中执行不同的 ActionResult - ASP.NET MVC4 EF5 HTML5

在 ASP .NET MVC 5.1/HTML 5 特定中显示日期时间选择器而不是日期选择器

通过不同域上的 REST Web 服务进行用户身份验证 - asp.net

是否可以在不同的 AppDomain 中运行 ASP.NET MVC 路由?

如何在 ASP.NET MVC 中处理 HTML5 多文件上传?

如何在 ASP.NET MVC 中的 HTML-5 data-* 属性中使用破折号