几乎所有OpenId依赖方都拒绝来自我的dotNetOpenAuth支持提供商的断言

时间:2011-04-19 23:49:04

标签: c# openid dotnetopenauth provider

构建一个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。但没有什么能说“啊哈,这已经坏了。”

1 个答案:

答案 0 :(得分:1)

这里发现了一大堆其他陷阱,其中没有一个真正属于dotNetOpenAuth。

  1. 这一切都是强制SSL,并重定向所有进来的HTTP流量。
    • ...除了所有HTTP流量的重定向都是/,这打破了发现
  2. HTML发现被破坏了。
    • 虽然从理论上讲,依赖方可以在实践中使用标题进行所有发现,几乎每个人都会在某些时候开始解析HTML。
  3. 一些依赖方破坏了OpenId 1.1和2.0规范
    • 这与#2略有不同,但是一些依赖方非常乐意使用标题(OpenId 2.0)进行发现,然后在返回的HTML中寻找openid.server
  4. dotNetOpenAuth作为其中一个(显然很少)OpenId库之一,可以通过标题完成整个OpenId舞蹈工作,巧合。

相关问题