我正在尝试在 C# .net7 中构建一个简单的 API 来处理 Oauth2 协议。我按照 YouTube 视频 (www.youtube.com/watch?v=PUXpfr1LzPE) 完成了我的所有构建。我遇到一个问题,无论我在
AuthenticationProperties.RedirectUri
中输入什么内容,它都会被我启动的域覆盖,并附加 OauthOptions.CallbackPath
。让事情变得更加困难的是,我尝试使用的重定向 URI 是一个与我启动的域、令牌端点、授权端点等完全独立的域,由 salesforce 或我的本地主机管理。所有域都采用 HTTPS,我必须将其删除,这样我的问题就不会被标记为垃圾邮件。
我尝试在评论部分设置一些
Oauthevents
,但失败了。
builder.Services.AddAuthentication("cookie").AddCookie("cookie").AddOAuth("Project", o =>
{
o.AuthorizationEndpoint = "mysalesforceSite.com/services/oauth2/authorize";
//o.CallbackPath = new PathString("Something.azurewebsites.net/external/callback");
o.CallbackPath = new PathString("/external/callback");
o.TokenEndpoint = "mysalesforceSite.my.site.com/services/oauth2/token";
o.ClientId = "123456";
o.ClientSecret = "A123456";
o.ReturnUrlParameter = "code";
o.SaveTokens = true;
o.UserInformationEndpoint = "mysalesforceSite.com/services/oauth2/userinfo";
//o.Events =
//new OAuthEvents
//{
// OnTicketReceived = async ctx =>
// {
// ctx.Properties.RedirectUri = "Something.azurewebsites.net/external/callback";
// //builder.Configuration.GetValue<string>("Project:CustomRedirectUri");
// await Task.Yield();
// },
// OnCreatingTicket = async ctx =>
// {
// ctx.Properties.RedirectUri = "Something.azurewebsites.net/external/callback";
// //builder.Configuration.GetValue<string>("Project:CustomRedirectUri");
// await Task.Yield();
// }
//};
}).AddCookie().AddIdentityCookies();
您将在下面的
AuthenticationProperties
对象实例中看到我正在尝试将 RedirectUri
设置为外部站点。但是,它将被我的启动域(本地主机)和上面我的OauthOptions
中指定的回调路径覆盖。
app.MapGet("/Login", () => {
AuthenticationProperties ap = new AuthenticationProperties()
{
RedirectUri = "Something.azurewebsites.net/external/callback",
//RedirectUri = "Something.azurewebsites.net/external/callback",
IsPersistent = true,
AllowRefresh = true,
};
Debug.WriteLine(ap.ToString());
return Results.Challenge(ap, authenticationSchemes: new List<string>() { "Project" });
});
完成后,它在 URL 和 swagger(我正在使用的 API UI 工具)中看起来像这样,将说明存在 CORS 或网络问题,但这实际上只是重定向 Uri 未正确构建,因为它将在当我手动构建它时邮递员。
我在执行时得到的: mysalesforceSite.com/services/oauth2/authorize?client_id=123456&scope=&response_type=code&redirect_uri=https%3A%2F%2Flocalhost%3A5005%2Fexternal%2Fcallback&state=CfDJ8P0Iuw_zGJdMlFeGMgyHhYRL4
我需要什么: mysalesforceSite.com/services/oauth2/authorize?client_id=123456&scope=&response_type=code&redirect_uri=https%3A%2F%2FSomething.azurewebsites.net%2Fexternal%2Fcallback&state=CfDJ8P0Iuw_zGJdMlFeGMgyHhYRL4
我想你用过
app.MapGet("/", (HttpContext ctx) =>
{
ctx.User.Claims.Select(x => new { x.Type, x.Value }).ToList();
});
在你的program.cs文件中,应该将MapGet(“/”...更改为MapGet(“/GitAuth”,然后将Github中的回调更改为“http://localhost:5000/GitAuth”,你可以使用自定义关键字对于“/GitAuth”和您的项目本地主机端口。这样您就可以同时拥有主页和 Github 身份验证。