私はそれがだけ LinkedInの認証のためのそれ自身のクッキーを落とすからミドルウェアを防ぐ「OnTicketReceived」のコードです...
app.UseOAuthAuthentication(new OAuthOptions
{
AuthenticationScheme = "LinkedIn",
DisplayName = "LinkedIn",
ClientId = Configuration["linkedin:clientId"],
ClientSecret = Configuration["linkedin:clientSecret"],
CallbackPath = new PathString("/signin-linkedin"),
AuthorizationEndpoint = "https://www.linkedin.com/oauth/v2/authorization",
TokenEndpoint = "https://www.linkedin.com/oauth/v2/accessToken",
UserInformationEndpoint = "https://api.linkedin.com/v1/people/~:(id,formatted-name,email-address,picture-url)",
Scope = { "r_basicprofile", "r_emailaddress", "w_share" },
Events = new OAuthEvents
{
OnTicketReceived = context =>
{
// Indicate that we handled the login
context.HandleResponse();
// Default redirect path is the base path
if (string.IsNullOrEmpty(context.ReturnUri))
{
context.ReturnUri = "/";
}
context.Response.Redirect(context.ReturnUri);
return Task.FromResult(0);
},
OnCreatingTicket = async context =>
{
// Retrieve user info
var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken);
request.Headers.Add("x-li-format", "json"); // Tell LinkedIn we want the result in JSON, otherwise it will return XML
var response = await context.Backchannel.SendAsync(request, context.HttpContext.RequestAborted);
response.EnsureSuccessStatusCode();
// Do database stuff to find user using parameters provided through oauth
// Perform identity sign in using sign in manager
await signInManager.SignInAsync(dbUser, false);
}
}
});
app.Map("/login", builder =>
{
builder.Run(async context =>
{
// Return a challenge to invoke the LinkedIn authentication scheme
await context.Authentication.ChallengeAsync("LinkedIn", properties: new AuthenticationProperties() { RedirectUri = "/" });
});
});
いくつかの試行錯誤を介してこれを解決することができました。
ローカルアカウントと他のプロバイダアカウント.....通常、ユーザーが初めてログインしたときにoauthを使用すると、ローカルユーザーとして保存することができますこれは最善のアプローチでなければならない...あるいは、ユーザーがoauth経由でログインしたときに混在したアプローチが必要な場合は、ローカルユーザーのいずれかと情報が関連しているかどうかをチェックします。 oauth情報をローカルアカウントに関連付けるかどうかを尋ね、トークン化されたURLを電子メールでローカルユーザーに送信して、その関連付けを承認するように求めます。ローカルユーザー>セキュリティのためのoauth。 – Hackerman
それは私がそれを理解したようにも、これまで読んだことのあるすべての例がどのように働いているように見えるのではないかと思われます(.net core ...) – Paul
これらのトピックについては、 ...私たちは通常、基本的なものを見つけるだけです... oauthパターンについて読んでから、ローカルユーザーとして保存するかどうかなど独自のデザイン決定を使用して独自のバージョンを作成し始めます。あなたのアプリを安全な状態に保ちながらローカルユーザーになる...これは読む価値があるhttps://tools.ietf.org/html/rfc6749 – Hackerman