简短问题: 我在.NET中使用Web API服务,并且只使用HTML和AngularJS构建了一个站点。
如何仅通过我的网络授权我的服务?
我正在寻找一个安全的答案,这个问题似乎很普遍但不是。我在后期阅读了很多答案,想法和各种事情,但我找不到解决方案。
我们假设我有一个来自MS的Web Api服务(最新的服务)。 所以我必须使用需要消耗它的应用程序。我们来定义两个场景。
情景1:
在同一个IIS中,我有一个ASP.NET MVC 3/4,其特点是所有MVC工作都在客户端,由AngularJS制作,因此App直接从JavaScript指向Web Api服务。 / p>
情景2:
我有第三方应用程序直接指向Web Api服务,并且位于其他网络/网站/任何相关的内容中。
所以,我的问题是:
如何对两个系统进行身份验证,以便Web Api服务提供对两个系统的访问(我不在乎是否相同),并且不向例如具有REST客户端的人提供访问权限,并使用用户/通行证授权登录该站点?我希望这两个例子都能说明我感兴趣的观点。
请在下面评论您需要以更好的方式改进此问题的任何内容!
顺便说一句,不,不能使用混淆。 我想到了一个令人耳目一新的令牌,但我无法想象它。
答案 0 :(得分:8)
如何使用方案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.config中设置<authentication>
和<authorization>
,如:
<authorization>
<allow roles="demo" />
</authorization>
或
<authorization>
<deny users="?" />
</authorization>
此外,我将设置我的登录页面:
<authentication mode="Forms">
<forms path="/" loginUrl="~/login"..
对于场景2 :
您可能需要启用CORS,如果是这种情况,您需要:
在config.EnableCors();
方法中设置配置选项Register
;您还需要使用 [EnableCors] 属性以及控制器的声明在ApiController中启用CORS,以下是我如何操作的示例:
[EnableCors(origins: "http://localhost:49595", headers: "*", methods: "*")]
public class ValuesController : ApiController
{
...
最后,为了保护WebApi,我们需要在控制器中使用属性[Authorize]
,并且您很可能需要定义自定义身份验证方法来授权您的第二个呼叫者。您可以按照以下步骤操作:
答案 1 :(得分:4)
不完全是问题的答案,但我想说的是评论太长,所以...
有various ways to secure a RESTful service,但如果您想限制对它的访问,您主要有两种方法:
根据您的工作情况,以上任何一项都无法奏效。
您想要的(根据您的问题我理解)是将访问您服务的客户限制为两个。在我的头脑中,我只能想到使用mutual authentication的HTTPS。您使用客户端证书来验证客户端。 IIS将处理连接,因此如果您的客户端在未提供证书的情况下发出请求,则拒绝该请求。除非他们拥有您提供的客户证书,否则任何人都无法访问您的服务。
所以这是为每个客户发放一个证书的问题。这适用于第三方应用,但由于浏览器直接访问您的API,因此可能无法实施。这意味着您需要为访问MVC应用程序的每个浏览器安装证书,或者在MVC服务器端移动对API的访问权限,而不再直接从AngularJS调用它。如果你可以做到其中任何一个都没问题,否则它会回到绘图板......
希望这有帮助!如果您找到合适的解决方案,请将其作为答案发布在SO上。