我如何将仅向经过身份验证的用户提供javascript文件?

问题描述 投票:8回答:4

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

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

asp.net asp.net-mvc asp.net-web-api asp.net-mvc-5 asp.net-web-api2
4个回答
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>,例如:

位置:脚本/安全/演示

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

或位置:脚本/安全的/

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

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

最近有类似的问题是否有帮助:

Secure angular app access and Web API Service


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版本即可。


0
投票

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

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

  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文件-如果您愿意的话。


-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
    });
© www.soinside.com 2019 - 2024. All rights reserved.