简短问题:
我在.NET中使用Web API服务,并且只使用HTML和AngularJS创建了一个站点。
如何仅通过我的网络授权我的服务?
我正在寻找一个似乎很常见的问题的安全答案,但事实并非如此。我在后期阅读了很多答案,想法和各种事情,但我找不到解决方案。
让我们假设我有一个来自MS的Web Api服务(最新的服务)。
所以我必须使用需要消耗它的应用程序。我们来定义两个场景。
场景1:
在同一个IIS中,我有一个ASP.NET MVC 3/4,其特点是所有MVC工作都在客户端,由AngularJS制作,因此App直接从JavaScript指向Web Api服务。
场景2:
我有一个第三方应用程序直接指向Web Api服务,并且位于其他网络/站点/任何但相关的任何内容。
所以,我的问题是:
如何验证两个系统,以便Web Api服务提供对两个系统的访问(我不在乎是否相同),并且不向例如具有REST客户端的人提供访问权限,并且登录到具有用户/通行证授权的网站?我希望这两个例子都能说明我感兴趣的观点。
请在下面评论您需要以更好的方式改进此问题!
顺便说一句,不,不能使用混淆。
我想到了一个令人耳目一新的令牌,但我无法理解。
我如何设置您的身份验证 情景1:
我将强制静态文件通过服务器以确保身份验证
Web.config文件
<compilation>
<buildProviders>
<add extension=".html" type="System.Web.Compilation.PageBuildProvider" />
<add extension=".htm" type="System.Web.Compilation.PageBuildProvider" />
</buildProviders>
</compilation>
<system.webServer>
<handlers>
<add name="HTML" path="*.html" verb="GET, HEAD, POST, DEBUG" type="System.Web.UI.PageHandlerFactory" resourceType="Unspecified" requireAccess="Script" />
<add name="HTM" path="*.htm" verb="GET, HEAD, POST, DEBUG" type="System.Web.UI.PageHandlerFactory" resourceType="Unspecified" requireAccess="Script" />
</handlers>
</system.webServer>
这将允许我设置 <authentication>
和 <authorization>
在我的web.config中:
<authorization>
<allow roles="demo" />
</authorization>
要么
<authorization>
<deny users="?" />
</authorization>
另外,我将设置我的登录页面:
<authentication mode="Forms">
<forms path="/" loginUrl="~/login"..
对于 场景2:
您可能需要启用CORS,如果是这种情况,您需要:
设置配置选项 config.EnableCors();
在你的 Register
方法;您还需要使用ApiController中的CORS [EnableCors] 属性以及控制器的声明,这是我如何做的一个例子:
[EnableCors(origins: "http://localhost:49595", headers: "*", methods: "*")]
public class ValuesController : ApiController
{
...
最后,为了保护WebApi,我们需要使用一个属性 [Authorize]
在控制器中,您很可能需要定义自定义身份验证方法以授权您的第二个呼叫者。您可以按照以下步骤操作:
我如何设置您的身份验证 情景1:
我将强制静态文件通过服务器以确保身份验证
Web.config文件
<compilation>
<buildProviders>
<add extension=".html" type="System.Web.Compilation.PageBuildProvider" />
<add extension=".htm" type="System.Web.Compilation.PageBuildProvider" />
</buildProviders>
</compilation>
<system.webServer>
<handlers>
<add name="HTML" path="*.html" verb="GET, HEAD, POST, DEBUG" type="System.Web.UI.PageHandlerFactory" resourceType="Unspecified" requireAccess="Script" />
<add name="HTM" path="*.htm" verb="GET, HEAD, POST, DEBUG" type="System.Web.UI.PageHandlerFactory" resourceType="Unspecified" requireAccess="Script" />
</handlers>
</system.webServer>
这将允许我设置 <authentication>
和 <authorization>
在我的web.config中:
<authorization>
<allow roles="demo" />
</authorization>
要么
<authorization>
<deny users="?" />
</authorization>
另外,我将设置我的登录页面:
<authentication mode="Forms">
<forms path="/" loginUrl="~/login"..
对于 场景2:
您可能需要启用CORS,如果是这种情况,您需要:
设置配置选项 config.EnableCors();
在你的 Register
方法;您还需要使用ApiController中的CORS [EnableCors] 属性以及控制器的声明,这是我如何做的一个例子:
[EnableCors(origins: "http://localhost:49595", headers: "*", methods: "*")]
public class ValuesController : ApiController
{
...
最后,为了保护WebApi,我们需要使用一个属性 [Authorize]
在控制器中,您很可能需要定义自定义身份验证方法以授权您的第二个呼叫者。您可以按照以下步骤操作:
不完全是问题的答案,但我想说的是评论太久了,所以......
有 各种保护RESTful服务的方法,但如果你想限制对它的访问,你主要有两种方法:
- 仅从内部网络或某种VPN使用该服务(即控制访问该服务的环境,并仅允许从某些特定来源访问);
- 让服务暴露给公众,但让应用程序或服务器丢弃任何不符合某些要求的请求(即未经过身份验证,缺少令牌,错误签名等)。
根据您的工作情况,以上都不适用。
你想要的(我从你的问题中理解)是将访问你的服务的客户限制为两个。在我的头脑中,我只能想到HTTPS 相互认证。您使用客户端证书来验证客户端。 IIS将处理连接,因此如果您的客户端在未提供证书的情况下发出请求,则拒绝该请求。除非他们拥有您提供的客户证书,否则任何人都无法访问您的服务。
所以这是为每个客户发放一个证书的问题。这适用于第三方应用,但由于浏览器直接访问您的API,因此可能无法实施。这意味着您需要为访问MVC应用程序的每个浏览器安装证书,或者在MVC服务器端移动对API的访问权限,而不再直接从AngularJS调用它。如果你可以做其中任何一个都没关系,否则它会回到绘图板......
希望这可以帮助!如果您找到合适的解决方案,请将其作为答案发布在SO上。