【发布时间】: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