Authentication ASP.NET Core 1.1将Windows身份验证与登录表单结合起来作为回退

Authentication ASP.NET Core 1.1将Windows身份验证与登录表单结合起来作为回退,authentication,asp.net-core,asp.net-core-1.0,asp.net-core-1.1,Authentication,Asp.net Core,Asp.net Core 1.0,Asp.net Core 1.1,目前,我们正在使用ASP.NET Core 1.1构建一个概念验证应用程序。目标是在内部网级别提供SSO,并提供登录页面,以便通过internet进行访问 到目前为止,我可以通过分别在IIS设置(launchSettings.json)web.config中设置“windowsAuthentication”:true来获取Kerberos票证 我构建了自己的身份验证中间件/身份验证处理程序 如果用户尚未通过身份验证,我会将其重定向到登录页面 但我的问题来了。第一个请求总是空的,然后服务器挑战Ke

目前,我们正在使用ASP.NET Core 1.1构建一个概念验证应用程序。目标是在内部网级别提供SSO,并提供登录页面,以便通过internet进行访问

到目前为止,我可以通过分别在IIS设置(launchSettings.json)web.config中设置
“windowsAuthentication”:true
来获取Kerberos票证

我构建了自己的身份验证中间件/身份验证处理程序

如果用户尚未通过身份验证,我会将其重定向到登录页面

但我的问题来了。第一个请求总是空的,然后服务器挑战Kerberos并获取票证。(我可能不理解Kerberos和挑战是如何工作的)

在我的函数
HandleUnauthorizedAsync
中,我无法知道IIS是否在响应票证,因此无法在IIS给出答案之前重定向它们

是否有人尝试过类似的方法或有解决问题的线索

问候

编辑: 请注意,这目前仅用于概念验证和测试

HandleAuthenticationAsync:

        if(Context.User?.Identity?.AuthenticationType == "Kerberos") {

            var identity = new ClaimsIdentity(new GenericIdentity(Context.User.Identity.Name, AeroAuthenticationOptions.DefaultSchemaName), new Claim[] {
                // get claims from claim store
            });

            var principal = new ClaimsPrincipal(identity);
            var ticket = new AuthenticationTicket(principal, new Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties { }, AeroAuthenticationOptions.DefaultSchemaName);

            return AuthenticateResult.Success(ticket);

        }

        return AuthenticateResult.Skip();
HandleUnauthorizedAsync:

        if(context == null) {

            throw new ArgumentNullException(nameof(context));

        }

        var properties = new AuthenticationProperties(context.Properties);
        var redirectUri = properties.RedirectUri;
        if(string.IsNullOrEmpty(redirectUri)) {

            redirectUri = OriginalPathBase + Request.Path + Request.QueryString;

        }

        var loginUri = Options.LoginPath + QueryString.Create(Options.ReturnUrlParameter, redirectUri);
        var redirectContext = new AeroCookieRedirectContext(Context, Options, BuildRedirectUri(loginUri), properties);
        await Options.Events.RedirectToLogin(redirectContext);

        return true;

几周前,我不得不实现一个类似的场景,请发布您的代码,以便我们能够看到实现细节并能够更好地帮助您。我很高兴不是唯一一个:)这不是“不工作”代码的意义,而是理解的意义。我如何在不知道Kerberos身份验证已被挑战的情况下拦截Kerberos身份验证。。。也许您可以分享您的知识?您看过identity server 4吗?我没有专门使用kerberos,但我为一个需要自定义两层身份验证的客户端工作,该客户端必须使用集成的windows auth和自定义中间件从其内部数据库获取用户角色(当然不是很理想,但他们坚持认为这就是他们想要的。所以我想看看你的代码,看看有没有什么奇怪的东西跳出来。我偶然发现了这个在.net mvc中使用windowsauth注销的解决方案,也许它有帮助: