Я установил очень простое приложение ASP.NET MVC 5, которое пытается аутентифицировать пользователя через провайдера OpenID в режиме кода авторизации.
Я могу войти в систему, и сервер возвращает код встрока запроса URL перенаправления и одноразовый cookie.Однако на клиентском приложении пользователь не аутентифицирован (User.Identity.IsAuthenticated
false), не имеет претензий и называется контроллером. Действие с атрибутом Authorize
никогда не выполняется.Браузер остается на странице URL перенаправления, которая является домашней страницей.
Я думаю, что что-то происходит во время выполнения промежуточного программного обеспечения OpenID Connect, которое останавливает его на полпути, но не может понять, как его отладить.
Не выдается никаких исключений даже в режиме «разбить на все исключения CLR».
При подключении EventListener к IdentityModelEventSource.Logger
на уровне VerboseЯ получаю только одно зарегистрированное событие, которое говорит «Генерация одноразового номера для сообщения openIdConnect» , один раз за попытку аутентификации.
Нет Notification
перехваты достигнуты, кроме RedirectToIdentityProvider
Таким образом, похоже, что код авторизации или токен безопасности не получен, но аутентификация тоже не удалась.
Как я могу получить больше информации о том, что происходит, чтобы я мог отладить мойпроблема?
Вот код:
public void Configuration(IAppBuilder app)
{
var clientSecret = "secret";
var authenticationOptions = new OpenIdConnectAuthenticationOptions
{
ClientId = "id",
ClientSecret = clientSecret,
Authority = "https://theauthority",
RedirectUri = "https://localhost/MyApp/",
};
authenticationOptions.ResponseType = OpenIdConnectResponseType.Code; // Authorization code
authenticationOptions.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(clientSecret));
authenticationOptions.TokenValidationParameters.RequireSignedTokens = true;
authenticationOptions.TokenValidationParameters.ValidAudience = "katanaclient";
authenticationOptions.SignInAsAuthenticationType = "Cookies";
authenticationOptions.Configuration = new OpenIdConnectConfiguration
{
Issuer = "https://theissuer",
AuthorizationEndpoint = "https://theendpoint",
TokenEndpoint = "https://theendpoint/api/v1/token",
UserInfoEndpoint = "https://theendpoint/api/v1/userinfo",
EndSessionEndpoint = "https://theendpoint/api/v1/logout",
ScopesSupported = { "openid", "profile"},
};
authenticationOptions.Notifications = new OpenIdConnectAuthenticationNotifications
{
RedirectToIdentityProvider = async n =>
{
// here it goes
if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.Authentication)
{
n.ProtocolMessage.EnableTelemetryParameters = false;
}
},
AuthorizationCodeReceived = async notification =>
{
// doesn't go through here
Debug.WriteLine($"{notification.Response.Body}");
},
SecurityTokenReceived = async notification =>
{
// doesn't go through here
Debug.WriteLine($"{notification.Response.Body}");
},
AuthenticationFailed = async notification =>
{
// doesn't go through here
Debug.WriteLine($"{notification.Response.Body}");
},
SecurityTokenValidated = async n =>
{
// doesn't go through here
Debug.WriteLine($"{n.Response.Body}");
},
MessageReceived = async notification =>
{
// doesn't go through here
Debug.WriteLine($"{notification.Response.Body}");
}
};
app.UseCookieAuthentication(new CookieAuthenticationOptions()
);
app.UseOpenIdConnectAuthentication(authenticationOptions);
Microsoft.IdentityModel.Logging.IdentityModelEventSource.Logger.LogLevel = EventLevel.Verbose;
Microsoft.IdentityModel.Logging.IdentityModelEventSource.ShowPII = true;
var listener = new EventListener();
listener.EnableEvents(Microsoft.IdentityModel.Logging.IdentityModelEventSource.Logger, EventLevel.LogAlways);
listener.EventWritten += Listener_EventWritten; // Only thing this ever logs is "generating nonce"
}
[Edit]
Я обнаружил, что в ASP.NET Core проект с GetClaimsFromUserInfoEndpoint = true
работает отлично.Но это свойство, к сожалению, отсутствует в более старой реализации Microsoft.Owin.Security.OpenIdConnect
...