Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 如何在asp.net core 2.0 API和Angular 6应用程序中处理具有相同代码库的多个子域?_Asp.net Core_Angular Ui Router_Angular6_Subdomain_Asp.net Core 2.0 - Fatal编程技术网

Asp.net core 如何在asp.net core 2.0 API和Angular 6应用程序中处理具有相同代码库的多个子域?

Asp.net core 如何在asp.net core 2.0 API和Angular 6应用程序中处理具有相同代码库的多个子域?,asp.net-core,angular-ui-router,angular6,subdomain,asp.net-core-2.0,Asp.net Core,Angular Ui Router,Angular6,Subdomain,Asp.net Core 2.0,我有一个web应用程序,它是用angular 6和asp.net核心API构建的 我的要求是对同一代码库使用多个子域,并基于子域验证用户和其他数据 例如,我的原始站点是www.example.com,子域是abc.example.com、def.example.com、xyz.example.com。 如果用户从def.example.com站点注册,则用户只能登录到def.example.com子域。如果用户试图登录abc.example.com或xyz.example.com,我们将抛出未经

我有一个web应用程序,它是用angular 6和asp.net核心API构建的

我的要求是对同一代码库使用多个子域,并基于子域验证用户和其他数据

例如,我的原始站点是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

Startup.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" });
                });
SubdomainRoute.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;
    }
}
公共类子域路由:IRouter
{
公共VirtualPathData GetVirtualPath(VirtualPathContext上下文)
{
返回null;
}
公共任务RouteSync(RouteContext RouteContext)
{
if(routeContext.HttpContext.Request==null | | routeContext.HttpContext.Request.Host.Host==null)
{
返回null;
}
var host=routeContext.HttpContext.Request.host.host;
var index=host.IndexOf(“.”);
string[]segments=routeContext.HttpContext.Request.Host.Host.TrimStart('/').Split(新字符[]{'/'),StringSplitOptions.RemoveEmptyEntries);
如果(指数<0)
{
返回null;
}
var subdomain=host.Substring(0,索引);
字符串[]黑名单={“www”,“drivebuyrei”,“mail”};
if(黑名单.包含(子域))
{
//返回null;
返回Task.CompletedTask;
}
字符串控制器=(segments.Length>0)?段[0]:“Home”;
字符串操作=(segments.Length>1)?段[1]:“索引”;
var routeData=新routeData();
routeData.Values.Add(“controller”,controller);//转到相关的controller类
routeData.Values.Add(“action”,action);//转到指定控制器上的相关操作方法
routeData.Values.Add(“subdomain”,subdomain);//将subdomain作为参数传递给操作方法
routeContext.RouteData=RouteData;
返回Task.CompletedTask;
}
}