构建一个OpenId提供程序,我遇到了一个奇怪的问题,只有Stack Exchange站点会接受它。
发现工作正常,看着我发送的日志流量(我看起来像什么)回复了有效的回复。
奇妙的是,没有合规性测试*告诉我什么是错的,大多数通过OpenId提供登录的网站也没有给你任何有用的错误消息。 Stack Overflow给出了一些,但它似乎是唯一接受我的断言的依赖方,所以......是的。
无论如何,如果我尝试登录(例如)Typepad我最终会重定向回到像
这样的网址
https://www.typepad.com/secure/services/signin/openid?openid-check=1&archetype.quickreg=1&tos_locale=en_US&portal=typepad&oic.time=1303249620-9db5665031c9c6b36031&openid.claimed_id=https://example/user/8c481fb7-1b5c-4e50-86b5-xxxxxxxxx&openid.identity=https://example/user/8c481fb7-1b5c-4e50-86b5-xxxxxxxxx&openid.sig=hoaxQrsN4BBg6H8kp50NoQwpHmcO96BBe+jB3oOP2UA=&openid.signed=claimed_id,identity,assoc_handle,op_endpoint,return_to,response_nonce,ns.alias3,alias3.mode&openid.assoc_handle={634388464235195799}{oqMrOA==}{32}&openid.op_endpoint=https://example/openid/provider&openid.return_to=https://www.typepad.com/secure/services/signin/openid?openid-check=1&archetype.quickreg=1&tos_locale=en_US&portal=typepad&oic.time=1303249620-9db5665031c9c6b36031&openid.response_nonce=2011-04-19T21:47:03Z1aa4NZ48&openid.mode=id_res&openid.ns=http://specs.openid.net/auth/2.0&openid.ns.alias3=http://openid.net/srv/ax/1.0&openid.alias3.mode=fetch_response
为(稍微)更容易阅读而突破:
openid-check=1
archetype.quickreg=1
tos_locale=en_US
portal=typepad
oic.time=1303249620-9db5665031c9c6b36031
openid.claimed_id=https://example/user/8c481fb7-1b5c-4e50-86b5-xxxxxxxxx
openid.identity=https://example/user/8c481fb7-1b5c-4e50-86b5-xxxxxxxxx
openid.sig=hoaxQrsN4BBg6H8kp50NoQwpHmcO96BBe+jB3oOP2UA=
openid.signed=claimed_id,identity,assoc_handle,op_endpoint,return_to,response_nonce,ns.alias3,alias3.mode
openid.assoc_handle={634388464235195799}{oqMrOA==}{32}
openid.op_endpoint=https://example/openid/provider
openid.return_to=https://www.typepad.com/secure/services/signin/openid?openid-check=1
archetype.quickreg=1
tos_locale=en_US
portal=typepad
oic.time=1303249620-9db5665031c9c6b36031
openid.response_nonce=2011-04-19T21:47:03Z1aa4NZ48
openid.mode=id_res
openid.ns=http://specs.openid.net/auth/2.0
openid.ns.alias3=http://openid.net/srv/ax/1.0
openid.alias3.mode=fetch_response
这是用户的XRDS(因为发现似乎没问题)。
<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS
xmlns:xrds="xri://$xrds"
xmlns:openid="http://openid.net/xmlns/1.0"
xmlns="xri://$xrd*($v*2.0)">
<XRD>
<Service priority="10">
<Type>http://specs.openid.net/auth/2.0/signon</Type>
<LocalID>https://example/user/8c481fb7-1b5c-4e50-86b5-xxxxxxxxx</LocalID>
<Type>http://openid.net/extensions/sreg/1.1</Type>
<Type>http://axschema.org/contact/email</Type>
<URI>https://example/openid/provider</URI>
</Service>
<Service priority="20">
<Type>http://openid.net/signon/1.0</Type>
<Type>http://openid.net/extensions/sreg/1.1</Type>
<Type>http://axschema.org/contact/email</Type>
<URI>https://example/openid/provider</URI>
</Service>
</XRD>
</xrds:XRDS>
如果你深入了解TypePad的html,你会发现以下错误信息
<!-- Error Code: unexpected_url_redirect -->
...这就是我用它们作为例子的原因。有点无用,但它的东西。
此代码非常基于dotNetOpenAuth附带的示例MVC项目,SendAssertion实现是我怀疑生病的地方。
protected ActionResult SendAssertion(IAuthenticationRequest authReq)
{
// Not shown: redirect to a prompt if needed
if (authReq.IsDirectedIdentity)
{
authReq.LocalIdentifier = Current.LoggedInUser.GetClaimedIdentifier();
}
if (!authReq.IsDelegatedIdentifier)
{
authReq.ClaimedIdentifier = authReq.LocalIdentifier;
}
authReq.IsAuthenticated = this.UserControlsIdentifier(authReq);
if (authReq.IsAuthenticated.Value)
{
// User can setup an alias, but we don't actually want relying parties to store that since it can change over time
authReq.ClaimedIdentifier = Current.LoggedInUser.GetClaimedIdentifier();
authReq.LocalIdentifier = Current.LoggedInUser.GetClaimedIdentifier();
// Not shown: responding to AX and SREG requests
}
var req = OpenIdProvider.PrepareResponse(authReq);
var ret = req.AsActionResult();
return ret;
}
对不起,这是一个巨大的信息转储,但我没有太多的事情继续下去,因此无法将其简化为简单的事情。
所以我猜最终的问题是......任何想法我在这里做错了吗?
*好的,有sort of tests。但没有什么能说“啊哈,这已经坏了。”
答案 0 :(得分:1)
这里发现了一大堆其他陷阱,其中没有一个真正属于dotNetOpenAuth。
/
,这打破了发现openid.server
。