基本上,它应该按照以下步骤进行:
用户点击登录
用户被重定向到第三方OAuth登录页面
用户登录页面
我获取access_token并请求用户信息
我获取用户信息并创建自己的JWT令牌,以便来回发送
我一直在遵循这篇很棒的教程来构建OAuth身份验证:这里,唯一不同的部分是Jerrie使用的是Cookies。
到目前为止,我已经完成了以下工作:
已配置AuthenticationService。
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的流程,一切正常。我不会在这里发布它,因为我的问题在那之前。
我想要的
在Jerrie的帖子中,您可以看到他设置了DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
。通过这种方式,当到达/auth/loginCallback
时,我在HttpContext
中拥有用户声明。
问题是我的DefaultAuthenticateScheme
设置为JwtBearersDefault
,当调用loginCallback
时,我无法在Request
中找到用户声明。
在这种情况下,如何访问在OnCreatingTicketEvent
中获得的信息以在我的回调中使用?
奖励问题:我对OAuth并不了解(确信现在清楚了)。您可能已经注意到,我的options.CallbackPath
与Challenge
中传递的RedirectUri
不同。 我期望第三方OAuth提供商将调用option.CallbackPath
,但事实并非如此(明显)。为使其工作,我确实必须将CallbackPath
设置为我在OAuth提供程序配置中设置的相同值(例如,类似于Jerries使用GitHub的教程)。这是正确的吗?回调仅用于匹配配置而不做其他用途吗?我甚至可以注释掉CallbackPath
指向的端点,它仍然以相同的方式工作...
谢谢!