可以尝试使用以下代码示例解决此问题:
在Startup.cs文件中,添加以下代码:
services.AddAuthentication(options =>
{
// ...
}).AddOpenIdConnect("oidc", options =>
{
// ...
options.Events.OnAuthorizationCodeReceived = async context =>
{
// 接收到授权代码时只执行一次
if (context.Properties.Items.TryGetValue(OpenIdConnectDefaults.UserstatePropertiesKey, out var userstate) && userstate == "unique_value")
{
context.HandleCodeRedemption();
await ((IMyService)context.HttpContext.RequestServices.GetService(typeof(IMyService))).MyMethod(context);
}
else
{
// 在context.Properties.Items中添加唯一值以标识此次执行
context.Properties.Items[OpenIdConnectDefaults.UserstatePropertiesKey] = "unique_value";
}
};
});
在上面的代码中,我们创建了一个唯一值"userstate"并将其添加到"context.Properties.Items"字典中,以标识此次执行。如果在"context.Properties.Items"字典中找到了"userstate"且值为"unique_value",则不再继续执行。否则,我们执行MyMethod()方法并将"context.Properties.Items"字典中的"userstate"值设置为"unique_value"以标识此次执行。
这样做可以确保"OnAuthorizationCodeReceived"事件仅在接收到授权代码时执行一次,并解决了事件被触发两次的问题。