Защита отдельных статических файлов в веб-приложении ASP.NET - PullRequest
0 голосов
/ 01 марта 2019

У меня есть требование защищать отдельные статические файлы в приложении ASP.NET (пока не в ASP.NET Core).

Справочная информация: У нас есть SPA (Angular), которая будет развернута в папке / dist на сервере.В том же приложении размещены некоторые REST API и концентраторы SignalR.Доступ к API REST защищен токеном-носителем OAuth (JWT).Доступ к статическим файлам не защищен.SPA реализован таким образом, что он сам выполняет аутентификацию и авторизацию через OIDC / OAuth (MSAL.js).SPA беседует с нашими REST API, а также с другими, размещенными в других местах (также защищенными через OAuth).

Наш клиент заказал аудитора безопасностиОни вернулись с отчетом о результатах проверки безопасности.Один из которых касается логики применения SPA.Это незащищено (шок).Каждый может посмотреть на это (шок).Аудитор безопасности предлагает незащищенную целевую страницу.Когда пользователи входят в систему, они перенаправляются в полноценный SPA.Только аутентифицированные пользователи могут видеть логику приложения (на мой взгляд, это не совсем выигрыш в безопасности).

Моя работа заключается в том, чтобы провести анализ того, как мы можем получить предложение и сколько затрат будет связано с этим изменением.

Команда разработчиков состоит из фронт-эндовых разработчиков (людей из Node.js), которые не имеют никаких знаний о ASP.NET.Моя мысль состояла в том, чтобы позволить им разработать целевую страницу, которая в конце концов, скорее всего, будет статическим файлом.

Поэтому мой вопрос заключается в том, можно ли настроить приложение 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();
    });
}
...