C# 如何确保用户';在OWIN应用程序中的WS-Federated身份验证后使用原始请求URL
我有一个OWIN应用程序,它使用cookie身份验证对用户进行身份验证,如果失败,它将尝试WS-Federated身份验证。换句话说,如果初始请求中没有正确的cookie,则转到STS并获取安全令牌 我遇到的问题是,如果使用联邦身份验证,则确保满足用户的原始URL请求。由于,我意识到从STS返回OWIN应用程序的重定向URL在wctx查询参数中包含“原始”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?)设置的。这是一个问题,因为这些值是在初始配置中设置的。我不需要硬编码的值——我只
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会存储起来,以便在身份验证完成后重定向
我很确定这就是它的工作原理,但我可能错了,如果有人有什么要补充的,我很想听听