我正在尝试将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时,它似乎返回了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
,就像ASP.Net实现的this一样,但是由于缺少{{1的服务'而导致无法构建class要求:
System.InvalidOperationException:'适合类型的构造函数 'TestApplication.SteamOpenId.SteamAuthenticationMiddleware'不可能 位于。确保类型具体并注册服务 公共构造函数的所有参数。'
我的实施:
OpenIdConnectMiddleware
我知道这个问题不是很具体,但有人能指出我正确的方向吗?我有点难过。
答案 0 :(得分:2)
似乎“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/。