繁体   English   中英

从 Google 身份验证接收 JWT 令牌而不是接收声明

[英]Receive JWT token from Google auth instead of receiving claims

我们正在使用 .NET Core 3.1 和 Google 身份验证。 这是我们目前的代码:

启动.cs:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddGoogle(googleOptions =>
    {
        googleOptions.ClientId = "CLIENT_ID"
        googleOptions.ClientSecret = "CLIENT_SECRET"
    })
    .AddCookie(options =>
    {
        options.LoginPath = "/Account/Login";
        options.AccessDeniedPath = "/Error/403";
    });

帐户控制器.cs:

public class AccountController : BaseController
{
    [AllowAnonymous]
    public IActionResult SignInGoogle()
    {
        return Challenge(new AuthenticationProperties
        {
            RedirectUri = Url.Action(nameof(SignInReturn))
        }, GoogleDefaults.AuthenticationScheme);
    }

    [AllowAnonymous]
    public IActionResult SignInReturn()
    {
        // Do stuff with the user here. Their information is in the User    
        // property of the controller.
        return Ok();
    }
}

当用户访问/Account/SignInGoogle时,他们将被重定向到 Google 登录页面。 一旦他们成功登录,他们将被重定向回/Account/SignInReturn 如果我在那里放置一个断点,我可以看到声明是在User属性中设置的。

但是,我们不希望自动设置User属性。 我们也不希望在调用SignInReturn用户视为已登录。 我们只想接收有关用户的信息(名字、姓氏、电子邮件),然后继续我们的自定义索赔处理逻辑。 是否可以?

Google 身份验证使用 OAuth2 协议。 Google 身份验证 package 只是将 OAuth 包装在 AuthenticationBuilder 设置中。 通过使用任何 OAUth2 库,您可以在 AspNetCore AuthenticationBuilder 外部进行身份验证并检索 JWT。

另请参阅: 什么是最好的 OAuth2 C# 库?

您可以通过处理OnCreatingTicket事件来访问令牌:

googleOptions.Events.OnCreatingTicket = (context) =>
{
    string accessToken = context.AccessToken;
    string refreshToken = context.RefreshToken;
    // do stuff with them
    return Task.CompletedTask;
}

请注意,除非您指定googleOptions.AccessType = "offline"; 即使这样,您也只有在第一次同意时才能获得它们(如果您需要刷新令牌,则可以触发重新同意)。

或者您可以遵循 Microsoft 提出的方法,该方法基本上将令牌保存在 cookie 中。 您可以在此处的文档中阅读相关内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM