我有一个支持子域的应用程序。每个子域代表一个公司,因此每个子域可能看起来像是他们自己网站的扩展。
这是使用通过此方法获得的companyId完成的:
/// <summary>
/// Get our company based from the URI host
/// </summary>
/// <returns>A company</returns>
public Company GetTenant()
{
var host = ConfigurationManager.AppSettings["domain"];
var currentHost = HttpContext.Current.Request.Headers["HOST"];
var defaultUri = GetUriFromUrl(host);
var currentUri = GetUriFromUrl(currentHost);
foreach (var company in this.GetAll("Settings"))
if (CheckCompanyByUri(company, currentUri))
return company;
if (!currentUri.IsLoopback && !CompareUrls(currentUri, defaultUri))
throw new Exception("The URL you have specified is not in our systems: " + currentUri.Host);
return null;
}
所以,我现在已经构建了一个api并希望使用 OAuthAuthorizationServerOptions ,但问题是每个公司的用户是不同的并且是通过使用 CompanyId 即可。
static Startup()
{
using (var uow = new UnitOfWork<SkipstoneContext>())
{
var service = new CompanyService(uow, null);
var company = service.GetTenant(); // HttpContext is not available at this point (so getting the url is impossible)
if (company != null)
{
var companyId = company.Id;
UserService = new UserService(uow, null, companyId);
PublicClientId = companyId;
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId, UserService),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
};
}
}
}
我无法从Startup类访问 HttpContext ,所以无论如何我真的可以从启动时访问当前请求的URL吗?
答案 0 :(得分:1)
启动时无法使用此功能。您将需要在IIS中设置单独的虚拟目录(如果您正在使用它)并且具有处理每个虚拟目录的实际不同的应用程序。
否则你需要对每个单独的请求进行过滤(大多数webframeworks都有某种路由引擎)。
答案 1 :(得分:0)
正如其名称所指出的那样,在启动应用程序时,启动运行。它是Web应用程序的入口点。它设置了中间件堆栈,包括您的应用程序作为堆栈中的最后一项。 这意味着,在那个阶段没有任何要求。
你想要的是写一个中间件,你将在OWIN管道的开头插入。
在该中间件中,您可以截取请求,分析所需的任何参数,并在点击任何应用程序代码之前重定向用户。
有任何帮助吗?
修改强>
伪代码示例:
public class MyMiddleware : OwinMiddleware
{
public MyMiddleware(OwinMiddleware next)
: base(next) { }
public override Task Invoke(IOwinContext context)
{
//Analyze the request.
//find the client id
//RedirectToClientSpecificUrl?
}
}
启动时:
app.Use<MyMiddleware>();
但你可能会找到一些快速谷歌的相关例子:
在这里,他处理身份验证,并在中间件中有一个重定向:
http://blog.tomasjansson.com/owin-middleware/