У меня есть требование защищать отдельные статические файлы в приложении 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();
});
}