Owin启动类和url

时间:2014-02-24 10:41:13

标签: c# startup owin

我有一个支持子域的应用程序。每个子域代表一个公司,因此每个子域可能看起来像是他们自己网站的扩展。

这是使用通过此方法获得的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吗?

2 个答案:

答案 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/