在ASP.NET MVC的Startup.cs文件中,重定向验证是否支持通配符?
解决NWebSec重定向验证中动态子域名的问题
NWebSec的AllowedDestinations方法不支持通配符,所以直接用https://*.abc.com/配置无效。以下是几种无需关闭验证的可行方案:
自定义子域名验证逻辑
通过AllowRedirectsTo方法传入自定义委托,手动校验重定向URL的主机是否属于目标域名的子域名,同时保留HTTPS要求:app.UseRedirectValidation(options => { options.AllowRedirectsTo(uri => { return uri.Scheme == Uri.UriSchemeHttps && (uri.Host.Equals("abc.com", StringComparison.OrdinalIgnoreCase) || uri.Host.EndsWith(".abc.com", StringComparison.OrdinalIgnoreCase)); }); options.AllowSameHostRedirectsToHttps(); });这个逻辑会允许所有
abc.com的一级/二级子域名(包括动态生成的),同时强制使用HTTPS协议。预注册已知子域名(限固定场景)
如果动态子域名是有限的已知集合,可直接将所有可能的子域名添加到允许列表:app.UseRedirectValidation(options => { options.AllowedDestinations( "https://sub1.abc.com/", "https://sub2.abc.com/", "https://sub3.abc.com/" ); options.AllowSameHostRedirectsToHttps(); });注意:此方案仅适用于子域名数量固定、可提前枚举的场景。
通过配置文件管理允许的域名后缀
将允许的域名后缀存入配置文件(如appsettings.json),便于后续维护:{ "AllowedRedirectDomains": ["abc.com"] }然后在代码中读取配置并实现通用验证逻辑:
var allowedDomains = Configuration.GetSection("AllowedRedirectDomains").Get<string[]>(); app.UseRedirectValidation(options => { options.AllowRedirectsTo(uri => { if (uri.Scheme != Uri.UriSchemeHttps) return false; return allowedDomains.Any(domain => uri.Host.Equals(domain, StringComparison.OrdinalIgnoreCase) || uri.Host.EndsWith($".{domain}", StringComparison.OrdinalIgnoreCase)); }); options.AllowSameHostRedirectsToHttps(); });这种方式无需修改代码即可扩展允许的域名范围。
内容的提问来源于stack exchange,提问作者Ruchita
相关产品推荐
相关产品推荐

