我们将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/

10-15 13:31