ASP.Net Core OpenIdConnect Steam

Я пытаюсь внедрить 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();
}

Я знаю, что этот вопрос не очень конкретный, но может ли кто-нибудь указать мне правильное направление? Я немного озадачен.


person René Sackers    schedule 11.06.2017    source источник


Ответы (1)


Кажется, есть разница между «OpenID» и «OpenID Connect».

Есть: OpenID 1/2 и OpenID Connect — совершенно разные протоколы.

Steam по-прежнему использует OpenID 2.0, поэтому вы не можете использовать промежуточное ПО ASP.NET Core OpenID Connect для аутентификации пользователей с использованием их учетной записи Steam, поскольку эти два протокола несовместимы/несовместимы.

Я знаю, что этот вопрос не очень конкретный, но может ли кто-нибудь указать мне правильное направление? Я немного озадачен.

Упомянутое вами промежуточное программное обеспечение aspnet-contrib Steam происходит от универсального поставщика OpenID 2.0, специально разработанного для ASP.NET Core, и поэтому, вероятно, является вашим лучшим вариантом (тем не менее, я тот парень, который написал его, поэтому я, вероятно, не цель).

Пакет можно найти на NuGet.org: https://www.nuget.org/packages/AspNet.Security.OpenId.Steam/.

person Kévin Chalet    schedule 11.06.2017
comment
Ах! Я должен был искать предварительные пакеты. Я мог бы поклясться, что пробовал подобное, и оно не предназначалось для .NETStandard. Спасибо, сейчас попробую! Я чувствую себя немного глупо. - person René Sackers; 11.06.2017