OAuth 与自定义 JWT 身份验证

共1个回答, 标签: c# authentication oauth oauth-2.0 .net-core

我正在努力用 OAuth 和 JWT 实现自定义身份验证流。基本上, 它应该如下所示:

  • 用户在登录时点击
  • 用户被重定向到第三方 OAuth 登录页面
  • 用户登录到页面
  • 我得到访问令牌和用户信息请求
  • 我得到的用户信息, 并创建自己的 JWT 令牌被来回发送

我一直在遵循这个伟大的教程如何建立 oauth 身份验证, 唯一不同的部分是, jerrie 正在使用 Cookies

到目前为止, 我所做的:

已配置身份验证服务

services.AddAuthentication(options =>
{
    options.DefaultChallengeScheme = "3rdPartyOAuth";
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie() // Added only because of the DefaultSignInScheme
.AddJwtBearer(options =>
{
    options.TokenValidationParameters = // Ommited for brevity
})
.AddOAuth("3rdPartyOAuth", options =>
{
    options.ClientId = securityConfig.ClientId;
    options.ClientSecret = securityConfig.ClientSecret;
    options.CallbackPath = new PathString("/auth/oauthCallback");

    options.AuthorizationEndpoint = securityConfig.AuthorizationEndpoint;
    options.TokenEndpoint = securityConfig.TokenEndpoint;
    options.UserInformationEndpoint = securityConfig.UserInfoEndpoint;

    // Only this for testing for now
    options.ClaimActions.MapJsonKey("sub", "sub");

    options.Events = new OAuthEvents
    {
        OnCreatingTicket = async context =>
        {
            // Request for user information
            var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint);
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken);

            var response = await context.Backchannel.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, context.HttpContext.RequestAborted);
            response.EnsureSuccessStatusCode();

            var user = JObject.Parse(await response.Content.ReadAsStringAsync());

            context.RunClaimActions(user);
        }
    };
});

身份验证控制器

    [AllowAnonymous]
    [HttpGet("login")]
    public IActionResult LoginIam(string returnUrl = "/auth/loginCallback")
    {
        return Challenge(new AuthenticationProperties() {RedirectUri = returnUrl});
    }

    [AllowAnonymous]
    [DisableRequestSizeLimit]
    [HttpGet("loginCallback")]
    public IActionResult IamCallback()
    {
        // Here is where I expect to get the user info, create my JWT and send it back to the client
        return Ok();
    }

免责声明: 此 OAuth 流正在合并。我有一个创建和使用我自己的 JWT 工作和一切的流程。我不会在这里发帖, 因为我的问题是在那之前。

我想要什么

在杰瑞的帖子中, 你可以看到他设置 DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; 。有了它, 当 /auth/loginCallback 达到我有用户声明中 HttpContext 。问题是我 DefaultAuthenticateScheme 设置为 JwtBearersDefault , 当 loginCallback 调用时, 我看不到用户声称在 Request 任何地方。OnCreatingTicketEvent在此方案中, 如何访问在回调中获得的信息?

第1个答案

更改 [AllowAnonymous]

[Authorize]

'loginCallback'在端点上 ( AuthController.IamCallback 方法)

相关问题

什么是 Null 引用异常, 以及如何修复它? 什么是 Null 引用异常, 以及如何修复它? 如何将 bool 更改为0或 1, 我可以将其转换为0或1? OAuth 与自定义 JWT 身份验证 Asp。Net 核心,检查是否允许匿名 什么是 google oauth 同意屏幕值? 如何阻止 Heroku 更改位置标头并使用我的 Spring 引导 OAuth2 服务导致401? 我应该在哪里过滤微服务架构模式中的 MS 级外部服务响应? Net Core: 为 AppService 、存储库等执行 Xunit 测试中的所有依赖注入 。Net Core 3.1 还不支持 Azure 管道托管代理?获取 NETSDK1045