我有一个Owin应用程序,它使用Ws-Federation身份验证和SSO应用程序(不是ADFS)。每当我的Owin应用程序收到请求时,它首先检查用户是否具有正确的cookie,然后从中构建声明和身份验证票证,从而对用户进行身份验证。如果它没有正确的cookie,它会重定向到STS,后者会传回可用于完成身份验证的SAML令牌。
除了一部分外,所有这些都有效。收到并验证令牌后,由于某种原因,它会重定向回STS,从而产生无限循环。我很确定这是因为我的一个或多个配置值是错误的,因为它并不十分清楚每个属性的用途以及是否需要。我已经复制了下面的配置代码:
public void Configuration(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType( CookieAuthenticationDefaults.AuthenticationType);
CookieAuthenticationOptions cookieOptions = new CookieAuthenticationOptions
{
AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
CookieName = "MyCookie",
CookiePath = "/CookiePath",
AuthenticationMode = AuthenticationMode.Active
};
// Basically the same as saying app.UseCookieAuthentication(app, cookieOptions)
app.Use(typeof(MyCustomCookieAuthenticationMiddleware), app, cookieOptions);
// Define properties for WsFederationAuthenticationOptions
var config = new Microsoft.IdentityModel.Protocols.WsFederationConfiguration
{
Issuer = "https://sts-domain.com/STS/",
TokenEndpoint = this.owinServerUrl // I don't know what this should be. I just made it the same as my owin start url
};
Saml2SecurityTokenHandler handler = new Saml2SecurityTokenHandler
{
Configuration = new SecurityTokenHandlerConfiguration
{
IssuerTokenResolver = new MyCustomSecurityTokenResolver
{
Thumbprint = somePublicKeyStr,
StoreLocation = System.Security.Cryptography.X509Certificates.StoreLocation.LocalMachine,
StoreName = "My"
}
}
};
var handlers = new SecurityTokenHandlerCollection(new List<SecurityTokenHandler>() { handler });
var wsFedOptions = new WsFederationAuthenticationOptions
{
AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType,
AuthenticationMode = AuthenticationMode.Passive,
SignInAsAuthenticationType = CookieAuthenticationDefaults.AuthenticationType, // I'm not sure what this is exactly, but I think I've seen this used in examples
Configuration = config,
Wtrealm = this.owinServerUrl, // I'm guessing what this should be
Wreply = someString, // I have no idea what this should be -- it hasn't seemed to have any effect so far
SecurityTokenHandlers = handlers,
TokenValidationParameters = new TokenValidationParameters
{
AuthenticationType = CookieAuthenticationDefaults.AuthenticationType, // I'm not sure whether this should be cookie or ws federation, but I don't think it's relevant to my problem
ValidIssuer = "https://sts-domain.com/STS/", // same as config.Issuer above
}
};
app.UseWsFederationAuthentication(wsFedOptions);
AuthenticateAllRequests(app, WsFederationAuthenticationDefaults.AuthenticationType);
app.Use<MyCustomMiddleware>();
}
private static void AuthenticateAllRequests(IAppBuilder app, params string[] authenticationTypes)
{
app.Use((context, continuation) =>
{
if (context.Authentication.User?.Identity?.IsAuthenticated ?? false)
{
return continuation();
}
else
{
context.Authentication.Challenge(authenticationTypes);
return Task.CompletedTask;
}
});
}
正如我在代码中指出我的评论,我不确定有一些属性。不幸的是,WsFederationAuthenticationOptions
的文档对我没什么帮助。例如,我知道Wtrealm
和Wreply
很重要(可能Wreply
更少),但所有文档都是&#34;获取或设置&#39; wtrealm&# 39;&#34;和&#34;获取或设置&#39; wreply&#39;。&#34;我发现this thread有一个解释:
wtrealm是标识RP的URI(不一定是URL)。 STS使用它来决定是否发出令牌以及提供令牌的权利。
wreply是RP希望使用生成的令牌重定向到的URL。 STS不一定遵守此请求......有时STS具有预定义的地址,它将根据已建立的信任重定向到该地址。至少,STS应该拒绝重定向到与域关联的域不同的域。否则,该请求可能是将用户发送到恶意站点的向量。
这是有道理的,除了我正在测试我的owin应用程序时,Wreply
似乎对STS被重定向到传递令牌的位置没有影响;我为Wtrealm
提供的网址决定了这一点。
我想做的就是让STS传回令牌,验证用户身份,然后继续执行用户指定的启动所有这一切的路由。我不确定这是否相关,但我也认为当STS传回令牌时应该设置cookie。如果是这种情况,则无限重定向将不会发生,因为当它返回进行身份验证时,cookie身份验证将找到cookie并且应用程序将正常进行。
更新1
我更改了一些值并得到了不同的错误消息,所以我想我会在这里分享它们,以防它们有助于阐明可能发生的事情。从你的帖子中可以看出,我不想分享关于该应用的真实信息,所以请耐心等待。让我们说总体网络应用程序(包含我的owin应用程序,以及其他一些东西)都有网址http://localhost/app
。我的owin应用程序有服务器URL(我在上面的代码中称之为this.owinServerUrl
)http://localhost/app/owin
。
WsFederationConfiguration.TokenEndpoint = "http://localhost/app"
时,我获得无限重定向。当我做"http://localhost/app/owin"
时,我没有获得无限重定向,但我确实得到了另一个错误(我得到的错误取决于其他值,我现在将解释)。Wreply
似乎有效果。如果我没有设置Wreply
,则会收到414错误:请求网址太长。当我设置它时(以及任何字符串,无论它是否是我认为可能有意义或只是乱码的URL),我收到400错误请求:请求时间过长。