我们将WsFederation身份验证与ADFS服务器一起使用。我们编写的大多数应用程序都可以使用下面的代码(当然不包括调试代码),但是我的应用程序只是不想工作。
我可以很好地重定向到AD服务器上的登录页面,并且可以毫无问题地输入UserId和Password,但返回时应该保存一个cookie,但事实并非如此。结果是在下一次往返中再次发生重定向(尽管这次没有登录表单)。
调试代码仅命中RedirectToIdentityProvider
。没有一个被调用。
该代码位于OWIN的Startup.cs中。
private static void ConfigureAuth(IAppBuilder app, ISettings settings)
{
app.SetDefaultSignInAsAuthenticationType(WsFederationAuthenticationDefaults.AuthenticationType);
// Work-around to fix Katana issue 197: https://katanaproject.codeplex.com/workitem/197
// https://github.com/KentorIT/owin-cookie-saver
app.UseKentorOwinCookieSaver();
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType
});
app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions
{
Wtrealm = settings.WsFedRealm,
MetadataAddress = settings.WsFedMetadataUrl,
TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = ClaimsExtensions.WurNameIdentifier,
SaveSigninToken = true,
// ValidIssuer = settings.ValidIssuer
},
Notifications = new WsFederationAuthenticationNotifications
{
MessageReceived = context =>
{
Log.Info($"Message received {context.ProtocolMessage}");
return Task.FromResult(0);
},
RedirectToIdentityProvider = context =>
{
Log.Info($"Redirect to identity provider {context?.Request?.Uri?.AbsolutePath}");
return Task.FromResult(0);
},
SecurityTokenValidated = context =>
{
Log.Info("Security token validated");
return Task.FromResult(0);
},
SecurityTokenReceived = context =>
{
Log.Info($"SecurityTokenReceived {context?.Response?.ReasonPhrase}");
return Task.FromResult(0);
},
AuthenticationFailed = context =>
{
Log.Error($"Authentication failed Uri:{context.Request?.Uri} User:{context.Request?.User?.Identity?.Name}");
context.HandleResponse();
context.Response.Redirect("~/Error?message=" + context.Exception.Message);
return Task.FromResult(0);
}
}
});
app.SetDefaultSignInAsAuthenticationType(WsFederationAuthenticationDefaults.AuthenticationType);
AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Name;
}
最佳答案
我认为问题是两个中间件都具有AuthenticationMode Active
我推荐一个自定义控制器。如果用户访问此控制器,则必须在OwinContext.Authentication上手动为WsFederationAuthenticationDefaults.AuthenticationType触发Authentication并返回401。这将触发WsFederationAuthenticationHandler中的ApplyResponseChallengeAsync。
在WsFederationAuthenticationOptions.Notifications的SecurityTokenValidated方法中,您可以发出新的AuthTicket,其身份类型为CookieAuthenticationDefaults.AuthenticationType。
现在,使用cookieauth将来自身份提供者的身份转换为本地身份。
关于c# - ADFS联合身份验证不返回 token ,也不保存cookie,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51046484/