此问题可能是由于ASP.NET MVC应用程序在重启后未能持久化OpenIdConnect授权状态而导致的。解决此问题的一种简单方法是将OpenIdConnect授权状态存储在会话中。以下是实现此解决方案的代码示例:
在Startup.cs文件中注册OpenIdConnect:
services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; }) .AddCookie() .AddOpenIdConnect(options => { options.ClientId = Configuration["OpenIdConnect:ClientId"]; options.ClientSecret = Configuration["OpenIdConnect:ClientSecret"]; options.Authority = Configuration["OpenIdConnect:Authority"]; options.CallbackPath = Configuration["OpenIdConnect:CallbackPath"]; options.ResponseType = Configuration["OpenIdConnect:ResponseType"]; options.SaveTokens = true; // 将授权状态保存到会话中 options.Scope.Add("openid"); options.Scope.Add("profile"); options.Scope.Add("email"); });
在授权代码接收处理程序中处理授权代码:
public async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedContext context) { // 从会话状态中获取授权状态 var accessToken = await HttpContext.GetTokenAsync("access_token"); var idToken = await HttpContext.GetTokenAsync("id_token"); var refreshToken = await HttpContext.GetTokenAsync("refresh_token");
// 使用授权状态来进行API调用
// ...
// 清除会话状态
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
}
通过此解决方案存储OpenIdConnect授权状态将可以确保在应用程序重新启动后也能够正确处理授权代码。