首页 > 解决方案 > 如何在 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;
    }
}

标签: asp.net-coreangular-ui-routerangular6subdomainasp.net-core-2.0

解决方案


推荐阅读