Asp.net mvc I';我同时使用Cookie和外部(Google)身份验证。当我登录谷歌时,我的cookie不会被创建。NET核心MVC6

Asp.net mvc I';我同时使用Cookie和外部(Google)身份验证。当我登录谷歌时,我的cookie不会被创建。NET核心MVC6,asp.net-mvc,cookies,oauth,asp.net-core,asp.net-core-mvc,Asp.net Mvc,Cookies,Oauth,Asp.net Core,Asp.net Core Mvc,因此,正如标题所说,我正在使用Cookies和谷歌进行登录/认证 Startup.cs Cookie片段 app.UseCookieAuthentication(options => { options.LoginPath = new PathString("/account/login"); options.AutomaticAuthenticate = true; o

因此,正如标题所说,我正在使用Cookies和谷歌进行登录/认证

Startup.cs Cookie片段

app.UseCookieAuthentication(options =>
            {
                options.LoginPath = new PathString("/account/login");
                options.AutomaticAuthenticate = true;
                options.AutomaticChallenge = true;
                options.ExpireTimeSpan = TimeSpan.FromDays(7);
                options.CookieName = "CUSTOMCOOKIE";
            });
app.UseGoogleAuthentication(options =>
{
    options.AutomaticAuthenticate = true;
    options.ClientId = "xx";
    options.ClientSecret = "xx";
}
Startup.cs谷歌代码片段

app.UseCookieAuthentication(options =>
            {
                options.LoginPath = new PathString("/account/login");
                options.AutomaticAuthenticate = true;
                options.AutomaticChallenge = true;
                options.ExpireTimeSpan = TimeSpan.FromDays(7);
                options.CookieName = "CUSTOMCOOKIE";
            });
app.UseGoogleAuthentication(options =>
{
    options.AutomaticAuthenticate = true;
    options.ClientId = "xx";
    options.ClientSecret = "xx";
}
当我登录谷歌时,我的CUSTOMCOOKIE不会显示。基本上,我想做的是让用户使用谷歌登录到该网站,并使用cookie记住用户x天


有什么我遗漏的吗?我还尝试将“options.AuthenticationScheme=“Cookies”设置为Cookie片段,并将“options.AuthenticationScheme=“Google”设置为Google片段。

您需要将Google选项的signnscheme设置为与主auth Cookie上的AuthenticationScheme相同,如下所示:

app.UseCookieAuthentication(options =>
{
    options.LoginPath = new PathString("/account/login");
    options.AutomaticAuthenticate = true;
    options.AutomaticChallenge = true;
    options.ExpireTimeSpan = TimeSpan.FromDays(7);
    options.AuthenticationScheme = "CUSTOMCOOKIE";
    options.CookieName = "CUSTOMCOOKIE";
});

app.UseGoogleAuthentication(options =>
{
    options.AutomaticAuthenticate = true;
    options.ClientId = "xx";
    options.ClientSecret = "xx";
    options.SignInScheme = "CUSTOMCOOKIE";
}

如果这不能让您继续,那么您需要显示用于google回调的帐户控制器的回调方法仅供将来参考,最新版本中的
app.UseCookieAuthentication
app.UseGoogleAuthentication
方法的签名有一点变化-

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    LoginPath = new PathString("/account/login"),
    AutomaticAuthenticate = true,
    AutomaticChallenge = true,
    ExpireTimeSpan = TimeSpan.FromDays(7),
    AuthenticationScheme = "CUSTOMCOOKIE",
    CookieName = "CUSTOMCOOKIE",
    Events = new CookieAuthenticationEvents
            {
                OnRedirectToAccessDenied = (context) =>
                {
                    context.Response.Redirect("/Auth/Logout");
                    return Task.FromResult(0);
                }
            }
});

app.UseGoogleAuthentication(new GoogleOptions
{
    AutomaticAuthenticate = true,
    ClientId = "xx",
    ClientSecret = "xx",
    SignInScheme = "CUSTOMCOOKIE",
    CallbackPath = new PathString("/auth/signin-google")
}

乔,非常感谢!我错过了“重要的主题”。这让我成功地得到了饼干。但是,在ExternalLoginCallback方法中,在使用新的.NET核心项目生成的默认代码中,“await _signInManager.GetExternalLoginInfoAsync();”返回null。设置自定义登录方案时,这是正常行为吗?因为即使我从启动时获得了用户和声明,它也不会显示用户为“已登录”。我认为他们在GetExternalLoginInfo中所做的是返回一个challengeresult。有多租户中间件,但它也碰巧有一个简单的工作谷歌认证没有身份,这可能会帮助你。如果您使用的是Identity,那么您需要将google cookie的AuthenticationScheme设置为与identityoptions externalcookie相同,或者可能不指定AuthSChem和cookiename,并且默认设置将在您未找到文档的情况下起作用,这里有非常清楚的说明这正是我所寻找的。我早该知道Ben Foster会为此大惊小怪的。非常感谢你,伙计。你真的帮了我很多,帮了我很多忙。这段代码在VS2017中似乎不起作用。它甚至不编译。如果我修复了编译错误(如删除PathString包装),它会编译,但在Google验证后不会发生任何事情(仍然保留相同的登录屏幕)。如果我再次点击谷歌,这次访问被拒绝页面。结果表明SignInScheme/AuthenticationScheme不能是任意的,它必须是“Identity.External”。在AccountController中,出于某种原因,
\u signInManager.GetExternalLoginInfoAsync
会在内部将其与此精确值进行检查。。