问题 验证站点/应用程序以访问Web API服务


简短问题: 我在.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客户端的人提供访问权限,并且登录到具有用户/通行证授权的网站?我希望这两个例子都能说明我感兴趣的观点。

请在下面评论您需要以更好的方式改进此问题!

顺便说一句,不,不能使用混淆。 我想到了一个令人耳目一新的令牌,但我无法理解。


2473
2018-05-18 02:56


起源



答案:


我如何设置您的身份验证 情景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] 在控制器中,您很可能需要定义自定义身份验证方法以授权您的第二个呼叫者。您可以按照以下步骤操作:


8
2018-05-27 16:50



omg,这是一个功能上的答案!我需要几个小时来学习并尝试这个!非常感谢!这是我一直在寻找的答案 - Leandro Tupone
<allow roles =“demo”/>是否可以允许所有经过身份验证的用户而不是基于角色? - Purushoth
@Purushoth只是为了改变它 <deny users="?" /> 哪里 ? 意味着未知或未经认证 - Dalorzo
谢谢@Dalorzo,它确实很有效。 - Purushoth
@Purushoth如果你支持这个答案,那就太好了 - Dalorzo


答案:


我如何设置您的身份验证 情景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] 在控制器中,您很可能需要定义自定义身份验证方法以授权您的第二个呼叫者。您可以按照以下步骤操作:


8
2018-05-27 16:50



omg,这是一个功能上的答案!我需要几个小时来学习并尝试这个!非常感谢!这是我一直在寻找的答案 - Leandro Tupone
<allow roles =“demo”/>是否可以允许所有经过身份验证的用户而不是基于角色? - Purushoth
@Purushoth只是为了改变它 <deny users="?" /> 哪里 ? 意味着未知或未经认证 - Dalorzo
谢谢@Dalorzo,它确实很有效。 - Purushoth
@Purushoth如果你支持这个答案,那就太好了 - Dalorzo


不完全是问题的答案,但我想说的是评论太久了,所以......

各种保护RESTful服务的方法,但如果你想限制对它的访问,你主要有两种方法:

  • 仅从内部网络或某种VPN使用该服务(即控制访问该服务的环境,并仅允许从某些特定来源访问);
  • 让服务暴露给公众,但让应用程序或服务器丢弃任何不符合某些要求的请求(即未经过身份验证,缺少令牌,错误签名等)。

根据您的工作情况,以上都不适用。

你想要的(我从你的问题中理解)是将访问你的服务的客户限制为两个。在我的头脑中,我只能想到HTTPS 相互认证。您使用客户端证书来验证客户端。 IIS将处理连接,因此如果您的客户端在未提供证书的情况下发出请求,则拒绝该请求。除非他们拥有您提供的客户证书,否则任何人都无法访问您的服务。

所以这是为每个客户发放一个证书的问题。这适用于第三方应用,但由于浏览器直接访问您的API,因此可能无法实施。这意味着您需要为访问MVC应用程序的每个浏览器安装证书,或者在MVC服务器端移动对API的访问权限,而不再直接从AngularJS调用它。如果你可以做其中任何一个都没关系,否则它会回到绘图板......

希望这可以帮助!如果您找到合适的解决方案,请将其作为答案发布在SO上。


4
2018-05-18 11:10



Thansk Bogdan,它有很多帮助,甚至是你5个项目答案的链接。最后一个想法的事情是我们需要跳转到ASP.NET并直接与$ http trought AngularJS连接。但HTTPS相互认证确实是一个很好的暗示。 - Leandro Tupone