Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 验证网站/应用程序以访问Web API服务_C#_Asp.net_Asp.net Mvc_Web Services_Angularjs - Fatal编程技术网

C# 验证网站/应用程序以访问Web API服务

C# 验证网站/应用程序以访问Web API服务,c#,asp.net,asp.net-mvc,web-services,angularjs,C#,Asp.net,Asp.net Mvc,Web Services,Angularjs,简短问题: 我在.NET中有一个Web API服务,还有一个只使用HTML和AngularJS创建的站点 如何仅授权我的网站使用我的服务? 我正在寻找一个安全的答案来解决一个看似常见但却并非如此的问题。在最近的几天里,我读了很多答案、想法和各种各样的东西,但我找不到解决办法 让我们假设我有一个来自MS的Web Api服务(最新的一个)。 因此,我必须使用需要的应用程序。让我们定义两个场景 场景1: 在同一个IIS中,我有一个ASP.NET MVC 3/4,其特殊性是所有MVC工作都在客户端,由

简短问题: 我在.NET中有一个Web API服务,还有一个只使用HTML和AngularJS创建的站点

如何仅授权我的网站使用我的服务?


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

让我们假设我有一个来自MS的Web Api服务(最新的一个)。 因此,我必须使用需要的应用程序。让我们定义两个场景

场景1:

在同一个IIS中,我有一个ASP.NET MVC 3/4,其特殊性是所有MVC工作都在客户端,由AngularJS制作,因此应用程序直接从JavaScript指向Web Api服务

场景2:

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

所以,我的问题是:

如何对两个系统进行身份验证,以使Web Api服务能够访问这两个系统(我不在乎这两个系统是否相同),而不允许使用REST客户端的人访问,并以用户/通过授权登录到站点?我希望这两个例子给出了我感兴趣的观点

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

顺便说一下,不,不能使用模糊处理。
我想到了一个让人耳目一新的标记,但我想不出来。

这不完全是对这个问题的回答,但我想说的话太长,无法发表评论,所以

有,但如果您想限制对它的访问,主要有两种方法:

  • 仅从内部网络或通过某种VPN使用服务(即控制访问服务的环境,仅允许从某些特定来源访问)
  • 将服务公开给公众,然后让应用程序或服务器删除任何不符合某些要求的请求(即未经身份验证、缺少令牌、错误签名等)
取决于你正在做什么,以上任何一项都不起作用

你想要的(正如我从你的问题中所理解的)是将访问你的服务的客户端限制为只有两个。在我的头顶上,我只能想到HTTPS。您可以使用客户端证书对客户端进行身份验证。IIS将处理连接,因此如果您的客户端在不提供证书的情况下发出请求,则请求将被拒绝。除非有您提供的客户端证书,否则任何人都无法访问您的服务

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


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

我将如何使用您的方案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>
最后,为了保护WebApi,我们需要在控制器中使用属性
[Authorize]
,并且很可能需要定义自定义身份验证方法来授权第二个调用者。您可以按照以下步骤操作:


Thansk Bogdan,这很有帮助,甚至连你的5项答案链接都有帮助。最后一个想法是,我们需要跳转trought ASP.NET并直接与$http trought AngularJS连接。但是HTTPS相互认证确实是一个很好的提示。天哪,这是一个功能上的答案!我需要几个小时来学习和尝试这个!谢谢!这就是我一直在寻找的答案,它是否可以允许所有经过身份验证的用户而不是基于角色的用户?@purushot只需将其更改为
,其中
表示未知或unauthenticated@Purushoth如果你能支持这个答案,我想授权视频文件夹中的视频,当我像这样使用时,我仍然能够访问视频,这只适用于我提供内容/视频时,它试图重定向到登录页面。当我喜欢url中的内容/videos/bigbugbunny.mp4时,可以访问这些视频。
<authorization>
  <allow roles="demo" />
</authorization>
 <authorization>
   <deny users="?" />
 </authorization>
<authentication mode="Forms">
      <forms  path="/" loginUrl="~/login"..
 [EnableCors(origins: "http://localhost:49595", headers: "*", methods: "*")]
 public class ValuesController : ApiController
 {
 ...