C# 如何确保用户';在OWIN应用程序中的WS-Federated身份验证后使用原始请求URL

C# 如何确保用户';在OWIN应用程序中的WS-Federated身份验证后使用原始请求URL,c#,.net,authentication,owin,ws-federation,C#,.net,Authentication,Owin,Ws Federation,我有一个OWIN应用程序,它使用cookie身份验证对用户进行身份验证,如果失败,它将尝试WS-Federated身份验证。换句话说,如果初始请求中没有正确的cookie,则转到STS并获取安全令牌 我遇到的问题是,如果使用联邦身份验证,则确保满足用户的原始URL请求。由于,我意识到从STS返回OWIN应用程序的重定向URL在wctx查询参数中包含“原始”URL。问题是,据我所知,这个值是使用(可能是Wreply?)设置的。这是一个问题,因为这些值是在初始配置中设置的。我不需要硬编码的值——我只

我有一个OWIN应用程序,它使用cookie身份验证对用户进行身份验证,如果失败,它将尝试WS-Federated身份验证。换句话说,如果初始请求中没有正确的cookie,则转到STS并获取安全令牌

我遇到的问题是,如果使用联邦身份验证,则确保满足用户的原始URL请求。由于,我意识到从STS返回OWIN应用程序的重定向URL在wctx查询参数中包含“原始”URL。问题是,据我所知,这个值是使用(可能是
Wreply
?)设置的。这是一个问题,因为这些值是在初始配置中设置的。我不需要硬编码的值——我只需要用户最初使用的URL(即
IOwinContext.Request.Uri
)。
Wtrealm
Wreply
的文档没有帮助解释值应该是什么

我原以为我可以在重定向到STS之前偷偷地将
Wtrealm
设置为用户的请求URL,但显然在发出
RedirectToIdentityProvider
通知时已经设置好了:

RedirectToIdentityProvider = context =>
{
    context.Options.Wtrealm = context.Request.Uri.ToString();
}

有人知道什么是正确的方法吗?有没有办法在初始配置中将
Wtrealm
设置为用户的请求URL?或者,
Wtrealm
不是我想的那样,我应该用另一种方式来处理这个问题吗?

我相信我已经弄明白了<正如我所怀疑的那样,代码>Wtrealm,并不是问题的根源;这用于确定STS应重新进入何处以完成联合身份验证,但还有另一个重定向URL用于确定身份验证后的去向

我使用ILSpy翻阅了
Microsoft.Owin.Security.WsFederation
源代码,发现有一个属性我没有设置:
AuthenticationProperties.RedirectUri
。此
RedirectUri
属性需要在重定向到STS之前设置,因为需要在验证后在
InvokeAsync
中使用。我有一个
AuthenticateAllRequests
方法,我在那里初始化这个
AuthenticationProperties
对象:

private static void AuthenticateAllRequests(IAppBuilder app, params string[] authenticationTypes)
            {
                app.Use((context, continuation) =>
                {
                    if (context.Authentication.User?.Identity?.IsAuthenticated ?? false)
                    {
                        return continuation();
                    }
                    else
                    {
                        AuthenticationProperties authProps = new AuthenticationProperties
                        {
                            RedirectUri = context.Request.Uri.ToString()
                        };
                        context.Authentication.Challenge(authProps, WsFederationAuthenticationDefaults.AuthenticationType);
                        return Task.CompletedTask;
                    }
                });
            }
更具体地总结一下:假设我的OWIN启动URL是。然后我设置
Wtrealm=”http://myapp.com/owin“
。假设一个用户转到,并使用SSO登录到身份验证服务器,但他们没有我的应用程序的cookie。在这种情况下,需要使用WS-Federated身份验证。在重定向到STS之前设置为
AuthenticationProperties.RedirectUri
,以便将其放入
wctx
查询参数中,因此可以在返回OWIN应用程序后使用

我以前很困惑,因为从STS返回后,我会看到
IOwinRequest.Uri=”http://myapp.com/owin“
,我假设这是最终的URL,用户的原始请求丢失了。现在更有意义的是,这是STS为了完成身份验证而重定向到的URL,但最终的重定向URL会存储起来,以便在身份验证完成后重定向

我很确定这就是它的工作原理,但我可能错了,如果有人有什么要补充的,我很想听听