Asp.net Core Identity 2.0 Google Logout

时间:2017-09-08 12:26:08

标签: c# asp.net-core google-signin asp.net-core-identity

我已开始研究Google登录并已添加了正常的提供商。

ddGoogle(go =>
            {
                go.ClientId = "xxxxx";
                go.ClientSecret = "-xxxxx";
                go.SignInScheme = IdentityConstants.ExternalScheme;
            });

我的测试方法只是为了启动它看起来像这样

public ActionResult TestGoogle()
{
    var redirectUrl = Url.Action(nameof(ExternalCallback), "Account", new { ReturnUrl = "" });
    var properties = _signInManager.ConfigureExternalAuthenticationProperties("Google", redirectUrl);
    return Challenge(properties, "Google");
}

一切顺利,我去google登录并按预期重定向所有必需的声明。

问题是当我打电话给_signInManager.SignOutAsync()时似乎没有做任何事情。没有错误,但当我回到我的TestGoogle操作时,我被重定向到所有凭据回调。

我缺少什么?

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

这是我配置代码的方式:

配置2个Cookies,一个(MainCookie)用于本地登录,第二个(ExternalCookie)用于谷歌。

services.AddAuthentication("MainCookie").AddCookie("MainCookie", options =>
        {

        });

services.AddAuthentication("ExternalCookie").AddCookie("ExternalCookie", o =>
        {

        });

配置Google身份验证,如下所示:

  services.AddAuthentication(
            v =>
            {
                v.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                v.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            }).

            AddGoogle("Google", googleOptions =>
         {
             googleOptions.ClientId = "xxx...";
             googleOptions.ClientSecret = "zzz...";
             googleOptions.SignInScheme = "ExternalCookie";
             googleOptions.Events = new OAuthEvents
             {
                 OnRedirectToAuthorizationEndpoint = context =>
                 {
                     context.Response.Redirect(context.RedirectUri + "&hd=" + System.Net.WebUtility.UrlEncode("gmail.com"));

                     return Task.CompletedTask;
                 }
             };
 });

TestGoogle()方法会将您重定向到谷歌登录页面。

然后,您可以像往常一样从Google获取声明:

 public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null)
    {
       var info = await HttpContext.AuthenticateAsync("ExternalCookie");

        //Sign in to local cookie and logout of external cookie
        await HttpContext.SignInAsync("MainCookie", info.Principal);
        await HttpContext.SignOutAsync("ExternalCookie");
        //ExternalCookie will be deleted at this point. 
        return RedirectToLocal(returnUrl);
    }

如果您现在想要验证任何方法,可以执行以下操作:

     [Authorize(AuthenticationSchemes = "MainCookie")]
     public async Task<IActionResult> Contact()
    {
       //Only authenticated users are allowed.
    }