【问题标题】:ASP.Net Core OpenIdConnect SteamASP.Net Core OpenIdConnect Steam
【发布时间】:2017-06-11 19:09:23
【问题描述】:

我正在尝试在我的 ASP.Net Core 应用程序中实现 Steam OpenId,但我之前没有任何实现 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:解析值时遇到意外字符: Newtonsoft.Json.JsonTextReader.ParseValue() InvalidOperationException:
IDX10803:无法从“http://steamcommunity.com/openid/.well-known/openid-configuration”获取配置。

当我查看这个 URL 时,它似乎返回了用于配置 OpenID 的 XML 数据:

<?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 规范声明此信息 should be in JSON

接下来我尝试注册自己的OpenIdConnectMiddleware,就像this 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();
}

我知道这个问题不是很具体,但是谁能指出我正确的方向?我有点难过。

【问题讨论】:

    标签: asp.net-core openid steam-web-api


    【解决方案1】:

    “OpenID”和“OpenID Connect”似乎有区别。

    有:OpenID 1/2 和 OpenID Connect 是完全不同的协议。

    Steam 仍在使用 OpenID 2.0,因此您不能使用 ASP.NET Core 的 OpenID Connect 中间件来使用他们的 Steam 帐户对您的用户进行身份验证,因为这两种协议不兼容/互操作。

    我知道这个问题不是很具体,但是谁能指出我正确的方向?我有点难过。

    您提到的 aspnet-contrib Steam 中间件源自专门为 ASP.NET Core 开发的通用 OpenID 2.0 提供程序,因此可能是您的最佳选择(也就是说,我是编写它的人,所以我'我可能不客观)。

    您可以在 NuGet.org 上找到该包:https://www.nuget.org/packages/AspNet.Security.OpenId.Steam/

    【讨论】:

    • 啊!我应该搜索预发布包。我可以发誓我尝试过这样的一个,它不是针对 .NETStandard 的。谢谢,我马上试试!我觉得有点傻。
    猜你喜欢
    • 2021-04-14
    • 2016-10-09
    • 2018-02-23
    • 2021-10-17
    • 2019-08-30
    • 2016-06-14
    • 2020-10-20
    • 1970-01-01
    • 2017-05-06
    相关资源
    最近更新 更多