验证站点/应用程序以访问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客户端,并登录到网站与用户/通过授权?我希望这两个例子都能说明我感兴趣的要点。
请在下面评论任何你需要以更好的方式改进这个问题的地方!
顺便说一下,不,不能使用混淆。
如何使用您的设置身份验证场景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上。