保护ASP.NET Web应用程序中的单个静态文件

时间:2019-03-01 12:48:13

标签: asp.net authentication single-page-application static-files

我有一个要求,我必须保护ASP.NET(但不是ASP.NET Core)应用程序中的单个静态文件。

背景:我们有一个SPA(Angular),该SPA将部署到服务器上的/ dist文件夹中。在同一应用程序上,托管了一些REST API和SignalR集线器。使用OAuth承载令牌(JWT)保护对REST API的访问。静态文件的访问不受保护。 SPA的实现方式是它本身通过OIDC / OAuth(MSAL.js)处理身份验证和授权。 SPA与我们托管的REST API以及与其他托管于其他地方(也受OAuth保护)的其他API进行通信。

我们的客户订购了一名安全审核员。他们返回了一份有关安全性发现的报告。其中之一与SPA的应用逻辑有关。它不受保护(震动)。每个人都可以调查(震惊)。安全审核员建议使用不受保护的目标网页。当用户登录时,他们将被转发到完整的SPA。只有经过身份验证的用户才能看到应用程序逻辑(在我看来,这并不是真正的安全收益)。

我的工作是分析我们如何实现该提案以及该变更将涉及多少成本。

开发团队由不了解ASP.NET的前端开发人员(Node.js人员)组成。我的想法是让他们开发目标网页,最终该目标网页很可能是静态文件。

所以我的问题是,是否可以配置ASP.NET应用程序,使对静态登录页面的访问不受保护,而对静态应用程序的访问受到保护。

作为参考,我将添加web.config和Startup.cs的一部分。

<rule name="Rewrite Static Assets" stopProcessing="true">
    <match url="{regex for static files}" />
    <conditions>
        <add input="{REQUEST_URI}" negate="true" pattern="^/dist/(.*)$" ignoreCase="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    </conditions>
    <action type="Rewrite" url="/dist/{R:1}" />
</rule>
public void Configuration(IAppBuilder app)
{
    ConfigureWebApi(app);
    ConfigureSignalR(app);
}

private static void ConfigureWebApi(IAppBuilder app)
{
    HttpConfiguration config = new HttpConfiguration();
    WebApiConfig.Register(config);

    string b2cTenant = ConfigurationManager.AppSettings["ida:DashboardTenant"];
    string clientId = ConfigurationManager.AppSettings["ida:SignalRB2cAudience"];
    string policy = ConfigurationManager.AppSettings["B2C AAD Policy"];

    var tvps = new TokenValidationParameters
    {
        ValidAudience = clientId,
        AuthenticationType = policy
    };

    var oidcConfUrl = string.Format($"https://login.microsoftonline.com/{b2cTenant}/v2.0/.well-known/openid-configuration?p={policy}");
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
    {
        AccessTokenFormat = new JwtFormat(
            tvps,
            new OpenIdConnectCachingSecurityTokenProvider(oidcConfUrl))
    });

    app.UseWebApi(config);
}

private static void ConfigureSignalR(IAppBuilder app)
{
    app.Map("/signalr", map =>
    {
        map.UseCors(CorsOptions.AllowAll);
        map.RunSignalR();
    });
}

0 个答案:

没有答案