gpt4 book ai didi

owin - 如何填充 OwinContext.Request.Path 和 PathBase?

转载 作者:行者123 更新时间:2023-12-03 23:06:39 25 4
gpt4 key购买 nike

基于 Katana 项目中的其他示例,我正在为 OpenID Connect 授权代码流编写自己的 OWIN 中间件。

作为其中的一部分,我必须构建几个 URI,例如一个重定向 URI 和一个返回 URL。

Katana 中的其他示例通过连接当前请求中的部分来做到这一点,例如在 CookieAuthenticationHandler

loginUri =
Request.Scheme +
Uri.SchemeDelimiter +
Request.Host +
Request.PathBase +
Options.LoginPath +
new QueryString(Options.ReturnUrlParameter, currentUri);

我的问题是哪些规则控制了两个路径属性的最终结果:
OwinContext.Request.Path
OwinContext.Request.PathBase

当请求通过下面管道中的不同处理程序时,我尝试检查这些属性,以获取请求:
"https://localhost/Client/login" // Where Client is a virtual directory in IIS

结果:
  • 在/login 的映射处理程序中,PathBase = "/Client/Login"。
  • 但是当请求在返回相同请求的途中到达我的 QuillCodeFlowHandler 中的 ApplyResponseChallengeAsync 方法时,PathBase = "/Client"和 Path = "/Login"。

  • 因此,如果不知道如何填充这些值的“规则”,然后再进行更改,就很难使用它们构造 URI。如果有人可以解释,将不胜感激。

    我的配置摘录是:
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
    AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
    LoginPath = new PathString("/Login")
    });

    app.UseQuillCodeFlowAuthentication(new QuillCodeFlowOptions());

    app.Map("/login", map =>
    {
    map.Run(async ctx =>
    {
    if (ctx.Authentication.User == null ||
    !ctx.Authentication.User.Identity.IsAuthenticated)
    {
    var authenticationProperties = new AuthenticationProperties();
    [...]
    ctx.Authentication.Challenge(authenticationProperties,
    QuillCodeFlowDefaults.AuthenticationType);

    OWIN specification给出了一些解释,Microsoft.Owin.Host.HttpListener.GetPathAndQuery 方法似乎是最初设置路径变量的地方。

    最佳答案

    使用构造时

    app.Map("/login", map => [...]

    这使用
    Owin.MapExtensions.Map

    它构造了一个实例
    Microsoft.Owin.Mapping.MapMiddleware

    对于需要运行的代码。

    我看到的行为在这个中间件的 Invoke 方法中有解释:
    public async Task Invoke(IDictionary<string, object> environment)
    {
    IOwinContext context = new OwinContext(environment);

    PathString path = context.Request.Path;

    PathString remainingPath;
    if (path.StartsWithSegments(_options.PathMatch, out remainingPath))
    {
    // Update the path
    PathString pathBase = context.Request.PathBase;
    context.Request.PathBase = pathBase + _options.PathMatch;
    context.Request.Path = remainingPath;

    await _options.Branch(environment);

    context.Request.PathBase = pathBase;
    context.Request.Path = path;
    }
    else
    {
    await _next(environment);
    }
    }

    基本上,代码在运行委托(delegate)之前会更改 Path 和 PathBase(等待 _options.Branch(environment) ),然后在执行完成后将它们设置回原始值。

    因此,我所看到的行为得到了解释。

    关于owin - 如何填充 OwinContext.Request.Path 和 PathBase?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25648722/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com