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

本文关键字:Web API 服务 访问 站点 应用程序 验证 | 更新日期: 2023-09-27 18:03:46

简短提问:我在。net中有一个Web API服务,和一个只用HTML和AngularJS制作的网站。

如何只授权给我的web服务?


我正在寻找一个安全的答案,似乎是常见的问题,但不是。最近几天,我读了很多答案、想法和各种各样的东西,但我找不到解决办法。

假设我有一个来自MS的Web Api服务(最新的一个)。所以我需要应用程序来消耗它。让我们定义两个场景。

场景1:

在同一个IIS中,我有一个ASP。. NET MVC 3/4的特点是所有MVC工作都在客户端,由AngularJS完成,所以应用程序直接从JavaScript指向Web Api Service。

场景2:

我有一个直接指向Web Api服务的第三方应用程序,并且位于其他网络/站点/任何不相关的地方。

所以,我的问题是:

如何认证两个系统,为了Web Api服务提供访问两个系统(我不在乎是否相同的方式),而不是给访问,例如一个家伙与REST客户端,并登录到网站与用户/通过授权?我希望这两个例子都能说明我感兴趣的要点。

请在下面评论任何你需要以更好的方式改进这个问题的地方!

顺便说一下,不,不能使用混淆。

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

如何使用您的设置身份验证场景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>

这将允许我在我的web中设置<authentication><authorization>。配置:

<authorization>
  <allow roles="demo" />
</authorization>

 <authorization>
   <deny users="?" />
 </authorization>

另外,我将设置我的登录页面:

<authentication mode="Forms">
      <forms  path="/" loginUrl="~/login"..

For 场景2:

您可能需要启用CORS,如果是这种情况,您将需要:

在您的Register方法中设置配置选项config.EnableCors();;您还需要通过使用[EnableCors]属性以及控制器声明来启用ApiController中的CORS,以下是我如何做的示例:

 [EnableCors(origins: "http://localhost:49595", headers: "*", methods: "*")]
 public class ValuesController : ApiController
 {
 ...

最后,为了确保WebApi的安全,我们需要在控制器中使用属性[Authorize],并且很可能需要定义自定义身份验证方法来授权第二个调用者。您可以按照以下步骤操作:

    如何设置WebApi自定义授权

不完全是问题的答案,但是我想说的对于评论来说太长了,所以…

有很多方法可以保护RESTful服务,但是如果你想限制对它的访问,你主要有两种方法:
  • 仅从内部网络或通过某种VPN使用服务(即控制访问服务的环境并仅允许从某些特定来源访问);
  • 将服务暴露给公众,但随后让应用程序或服务器放弃任何不符合某些要求的请求(即未经过身份验证,丢失令牌,错误签名等)。

取决于你在做什么,以上都不能工作。

你想要的(正如我从你的问题中理解的)是将访问你的服务的客户端限制为两个。在我的脑海中,我只能想到具有相互身份验证的HTTPS。您使用客户端证书对客户端进行身份验证。IIS将处理连接,因此如果您的客户端在没有提供证书的情况下发出请求,请求将被拒绝。没有人可以访问你的服务,除非他们有你提供的客户端证书。

所以这是为每个客户端颁发一个证书的问题。这适用于第三方应用程序,但由于浏览器直接访问您的API,因此可能无法实现。这意味着你需要为每个访问MVC应用程序的浏览器安装一个证书,或者将对MVC服务器端的API的访问移到服务器端,而不再直接从AngularJS调用它。如果你能做到这两点,那就好了,否则就得从头开始了。

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