Я пытаюсь внедрить Steam OpenId в свое приложение ASP.Net Core, и у меня нет предыдущих опыт внедрения OpenID.
К сожалению, Steam очень не хватает документации на своей стороне, и они просто заявляют «просто скачайте библиотеку OpenID» и предоставляют вам страницу для регистрации ключа API для доменного имени.
Есть несколько реализаций, доступных для полного ASP.Net, но не для Core, и, кажется, есть некоторые различия.
Я пытаюсь использовать Microsoft.AspNetCore.Authentication.OpenIdConnect , хотя я не совсем уверен, что это правильная библиотека. Кажется, есть разница между "OpenID" и "OpenID Connect".
Я настроил аутентификацию в своем Startup.cs следующим образом:
app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
DisplayName = "Steam",
Authority = "http://steamcommunity.com/openid",
ClientId = "MyClientId",
ClientSecret = "ApiKeyHere",
SignInScheme = "SignInCookie",
CallbackPath = new PathString("/Account/SteamCallback"),
RequireHttpsMetadata = false
});
Но как только я попадаю на страницу входа, которая состоит из действия, возвращающего вызов:
public IActionResult SignIn()
{
return Challenge();
}
я получаю ошибку
JsonReaderException: при синтаксическом анализе значения обнаружен неожиданный символ: ‹. Путь '', строка 0, позиция 0.
Newtonsoft.Json.JsonTextReader.ParseValue() InvalidOperationException:
IDX10803: невозможно получить конфигурацию из: 'http://steamcommunity.com/openid/.well-known/openid-configuration'.
Когда я смотрю на этот URL, кажется, что он возвращает XML-данные для конфигурации OpenID:
<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)">
<XRD>
<Service priority="0">
<Type>http://specs.openid.net/auth/2.0/server</Type>
<URI>https://steamcommunity.com/openid/login</URI>
</Service>
</XRD>
</xrds:XRDS>
Но в спецификации OpenID указано, что эта информация должна быть в формате JSON. .
Затем я попытался зарегистрировать свой собственный OpenIdConnectMiddleware
, примерно так же, как эта реализация ASP.Net делает это, однако это привело к невозможности создания из-за отсутствия служб, которые требуются классу OpenIdConnectMiddleware
:
System.InvalidOperationException: «Не удалось найти подходящий конструктор для типа TestApplication.SteamOpenId.SteamAuthenticationMiddleware». Убедитесь, что тип конкретен, а службы зарегистрированы для всех параметров общедоступного конструктора.
Моя реализация:
public class SteamAuthenticationMiddleware : OpenIdConnectMiddleware
{
public SteamAuthenticationMiddleware(
RequestDelegate next,
IDataProtectionProvider dataProtectionProvider,
ILoggerFactory loggerFactory,
UrlEncoder encoder,
IServiceProvider services,
IOptions<SharedAuthenticationOptions> sharedOptions,
IOptions<OpenIdConnectOptions> options,
HtmlEncoder htmlEncoder) :
base(
next,
dataProtectionProvider,
loggerFactory,
encoder,
services,
sharedOptions,
options,
htmlEncoder)
{
}
protected override AuthenticationHandler<OpenIdConnectOptions> CreateHandler() => new SteamAuthenticationHandler();
}
Я знаю, что этот вопрос не очень конкретный, но может ли кто-нибудь указать мне правильное направление? Я немного озадачен.