asp.net-core - 如何在 asp.net core 2.0 API 和 Angular 6 应用程序中处理具有相同代码库的多个子域?
问题描述
我有一个使用 angular 6 和 asp.net 核心 API 构建的 Web 应用程序。
我的要求是为同一个代码库使用多个子域,并基于子域验证用户和其他数据。
例如,我的原始站点是 www.example.com,子域是 abc.example.com、def.example.com、xyz.example.com。如果用户从 def.example.com 站点注册,用户只能登录 def.example.com 子域。如果用户尝试登录 abc.example.com 或 xyz.example.com,我们将抛出未经授权的错误。
注意:我们对所有子域使用相同的代码库和相同的数据库。
任何帮助,将不胜感激。
我在 startup.cs 中添加了一个路由,在其中我使用 RouteContext.HttpContext.Request.Host.Host 获取子域名。我使用它获得了正确的子域名,但我无法将此子域名传递给我的 API。
启动.cs
app.UseMvc(routes =>
{
routes.Routes.Add(new SubdomainRoute());
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
"Sitemap",
"sitemap.xml",
new { controller = "Home", action = "SitemapXml" });
routes.MapSpaFallbackRoute(
name: "spa-fallback",
defaults: new { controller = "Home", action = "Index" });
});
子域路由.cs
public class SubdomainRoute : IRouter
{
public VirtualPathData GetVirtualPath(VirtualPathContext context)
{
return null;
}
public Task RouteAsync(RouteContext routeContext)
{
if (routeContext.HttpContext.Request == null || routeContext.HttpContext.Request.Host.Host == null)
{
return null;
}
var host = routeContext.HttpContext.Request.Host.Host;
var index = host.IndexOf(".");
string[] segments = routeContext.HttpContext.Request.Host.Host.TrimStart('/').Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
if (index < 0)
{
return null;
}
var subdomain = host.Substring(0, index);
string[] blacklist = { "www", "drivebuyrei", "mail" };
if (blacklist.Contains(subdomain))
{
//return null;
return Task.CompletedTask;
}
string controller = (segments.Length > 0) ? segments[0] : "Home";
string action = (segments.Length > 1) ? segments[1] : "Index";
var routeData = new RouteData();
routeData.Values.Add("controller", controller); //Goes to the relevant Controller class
routeData.Values.Add("action", action); //Goes to the relevant action method on the specified Controller
routeData.Values.Add("subdomain", subdomain); //pass subdomain as argument to action method
routeContext.RouteData = routeData;
return Task.CompletedTask;
}
}
解决方案
推荐阅读
- swift - Swift 编译器可以为我的应用程序创建一个可执行文件吗?
- c++ - 通过字符串获取类成员
- python-sphinx - Python Sphinx 验证和更新架构
- node.js - NodeJs/Powershell 下载问题
- javascript - 为什么弹出窗口不显示滑块的值
- python - time.time() 或 time.perf_counter() — 哪个更快?
- java - 我在使用带有图的递归时遇到了很多麻烦。爪哇
- python - Python For Loop 执行意外数量的循环
- c# - 如何在 Unity 中使用 Q#?
- html - 网格结果水平呈现,而不是垂直呈现