Я использую в своем приложении промежуточное ПО для использования внешней аутентификации с Identity Provider.Код (не весь Startup, а только часть, относящаяся к этому промежуточному программному обеспечению) выглядит следующим образом:
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
Authority = "http://localhost:50001",
RedirectUri = "http://localhost:26525/signin-oidc",
PostLogoutRedirectUri = "http://localhost:26525/signout-callback-oidc",
RequireHttpsMetadata = false,
ClientId = "webforms2",
AuthenticationType = "oidc",
SignInAsAuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
ResponseType = "id_token token",
Scope = "openid profile email",
UseTokenLifetime = false
});
Работает нормально.В настоящий момент я добавляю свойство Notification и прошу Identity Server использовать полученный Identity Token для получения дополнительных требований. Я получаю исключение.Шаг за шагом, код выглядит так, что часть вызывает исключение:
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
Authority = "http://localhost:50001",
RedirectUri = "http://localhost:26525/signin-oidc",
PostLogoutRedirectUri = "http://localhost:26525/signout-callback-oidc",
RequireHttpsMetadata = false,
ClientId = "webforms2",
AuthenticationType = "oidc",
SignInAsAuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
ResponseType = "id_token token",
Scope = "openid profile email",
UseTokenLifetime = false,
Notifications = new OpenIdConnectAuthenticationNotifications
{
SecurityTokenValidated = async n =>
{
var claimsToExclude = new[]
{
"aud", "iss", "nbf", "exp", "nonce", "iat", "at_hash"
};
var claimsToKeep = n.AuthenticationTicket.Identity.Claims.Where(x => !claimsToExclude.Contains(x.Type)).ToList();
claimsToKeep.Add(new Claim("id_token", n.ProtocolMessage.IdToken));
if (n.ProtocolMessage.AccessToken != null)
{
claimsToKeep.Add(new Claim("access_token", n.ProtocolMessage.AccessToken));
var client = new HttpClient();
var disco = await client.GetDiscoveryDocumentAsync("http://localhost:50001");
var userInfoResponse = await client.GetUserInfoAsync(new UserInfoRequest
{
Address = disco.UserInfoEndpoint,
Token = n.ProtocolMessage.AccessToken
});
var userInfoClaims = userInfoResponse.Claims
.Where(x => x.Type != "sub"); // filter sub since we're already getting it from id_token
claimsToKeep.AddRange(userInfoClaims);
}
var ci = new ClaimsIdentity(n.AuthenticationTicket.Identity.AuthenticationType, "name", "role");
ci.AddClaims(claimsToKeep);
n.AuthenticationTicket = new Microsoft.Owin.Security.AuthenticationTicket(ci, n.AuthenticationTicket.Properties);
},
RedirectToIdentityProvider = n =>
{
if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.Logout)
{
n.ProtocolMessage.IdTokenHint = n.OwinContext.Authentication.User.FindFirst("id_token")?.Value;
}
return Task.FromResult(0);
}
}
});
И я не могу понять исключение, потому что mscorlib.pdb не загружен всплывает без дополнительной информации,На самом деле я вижу эту страницу всплывающей, потому что я отключил опцию Просто мой код в Сервис> Отладка> Общие.В противном случае приложение просто скажет, что мое «приложение перешло в состояние останова».В этом случае, если я проверяю стек вызовов, я вижу, что последний вызов:
mscorlib.dll!System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start<System.__Canon>(ref System.__Canon stateMachine) Unknown
Заранее спасибо за помощь!