如何将javascript文件的服务限制为仅经过身份验证的用户?

时间:2014-05-27 01:24:00

标签: asp.net asp.net-mvc asp.net-web-api asp.net-mvc-5 asp.net-web-api2

我有一个使用Identity 2进行身份验证的WebAPI 2 / AngularJS SPA应用程序。本地我的代码存储用于身份验证的令牌。我想实现一些功能,允许我的应用程序在下载初始index.html页面后为经过身份验证的用户请求其他javascript。

有没有办法让我的服务器代码只向经过身份验证和授权的用户提供 javascript文件?类似于控制器操作方法仅向经过身份验证和授权的用户返回数据的方式。

4 个答案:

答案 0 :(得分:4)

您可以强制静态文件通过服务器,以通过在web.config上设置验证来确保身份验证:

<强>的Web.config

<compilation>
    <buildProviders>
        <add extension=".html" type="System.Web.Compilation.PageBuildProvider" />
        <add extension=".htm" type="System.Web.Compilation.PageBuildProvider" />
         <add extension=".js" type="System.Web.Compilation.ForceCopyBuildProvider"/>
    </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中为我想要的位置设置<authorization>,例如:

位置:scripts / secured / demo

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

或位置:scripts / secured /

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

http://msdn.microsoft.com/en-us/library/h0e51sw9(v=vs.85).aspx

最近有一个类似的问题,如果它有帮助:

Secure angular app access and Web API Service

答案 1 :(得分:3)

如果您在IIS中托管您的站点,则可以将IIS配置为通过.Net框架提供* .js文件。 然后,您需要创建一个HTTPHandler来提供这些文件(检查用户是否在HTTPHandler代码中进行了身份验证)。

如果您不确定从哪里开始,可以阅读Combine, minify and compress JavaScript files to load ASP.NET pages faster或类似文章。虽然目的不同,但它解释了如何通过ASP .Net提供js文件。您只需将身份验证检查添加到HTTPHandler。

更新: Here is an explanation如何为此设置IIS。只需确保您知道自己的IIS版本。

答案 2 :(得分:0)

另一个选择:从webapi服务您的js!

这肯定不是执行此操作的最佳方法,但它效果很好,可以为您提供很多控制,非常容易动动脑筋,并且不需要更改IIS或配置文件。 我在几个ASP.Net项目-YMMV中的WebAPI2上执行此操作。

(另一件棘手的事情是,如果您希望身份验证机制通过请求标头中的Bearer令牌实现-除非您通过ajax下载javascript,然后将其添加到文档中,否则这几乎是不可能的。 ..或将令牌放入查询字符串中-这很奇怪,因为您必须使用令牌呈现脚本标签。这对于基于Cookie的身份验证确实效果最好。)

  1. 将您的JS文件加载到API控制器上的静态变量中
  2. 确保已为WebAPI(https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2)打开了属性路由
  3. 使用以下路径为您的JavaScript文件创建端点:
[Route("api/system/GlobalConstants.js")]
public HttpResponseMessage GlobalConstantJS()
{
    var resp = new HttpResponseMessage(HttpStatusCode.OK)
    {
        Content = new StringContent(MY_STATIC_STRING_WITH_THE_JS_TEXT)
    };
    return resp;
}
  1. 确保您的API控制器受Authorize属性保护:)
  2. 使用普通的常规脚本元素,指向路由:
 <script src="~/api/system/GlobalConstants.js" type="text/javascript"></script>

...显然,这还有另一个优势,就是能够提供动态生成的javascript文件-如果您愿意的话。

答案 3 :(得分:-2)

如果你可以使用jQuery,那么有一个$.getScript ajax函数。 http://api.jquery.com/jquery.getscript/

这是对服务器的异步调用以加载javascript文件。但是在服务器端,如果用户当前未通过服务器验证,则返回null。

$.getScript('url', function(data) {
        // check if data is null, if yes, means the user needs to be authenticated still
    });