Asp.net core 如何在asp.net core 2.0 API和Angular 6应用程序中处理具有相同代码库的多个子域?
我有一个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.csAsp.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,我们将抛出未经
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;
}
}