Почти все полагающиеся стороны OpenId отклоняют утверждения от моего поставщика, поддерживаемого dotNetOpenAuth.

Создавая поставщика OpenId, я столкнулся с любопытной проблемой: его принимают только сайты Stack Exchange.

Обнаружение работает нормально, и, наблюдая за трафиком журнала, я отправляю (как мне кажется) действительный ответ.

Как ни странно, нет тестов на соответствие *, которые могли бы сказать мне, что не так, и большинство сайтов, предлагающих вход через OpenId, не выдают каких-либо полезных сообщений об ошибках. Stack Overflow дает кое-что, но, похоже, это единственная полагающаяся сторона, которая просто принимает мои утверждения, так что ... да.

В любом случае, если я попытаюсь войти (например) в Typepad, я в конечном итоге перенаправлю обратно на URL как

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>

Если вы покопаетесь в HTML-коде TypePad, вы обнаружите следующее сообщение об ошибке

<!-- Error Code: unexpected_url_redirect -->

... поэтому я использую их в качестве примера. Вроде бесполезно, но кое-что.

Этот код в значительной степени основан на примере проекта MVC, который поставляется с dotNetOpenAuth, реализация SendAssertion - это то место, где я < em> подозреваю, что дела идут плохо.

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;
}

Извините, это такой огромный информационный дамп, но мне нечего сказать и, соответственно, я не могу сузить его до чего-то простого.

Итак, я предполагаю, что главный вопрос в том ... есть идеи, что я здесь делаю не так?

* Хорошо, есть своего рода тесты. Но ничего не говорит «ага, это сломано».


person Kevin Montrose    schedule 19.04.2011    source источник


Ответы (1)


Здесь оказалось множество других ошибок, ни одна из которых не имеет отношения к dotNetOpenAuth.

  1. This whole thing is forcing SSL, and redirecting all HTTP traffic that comes in.
    • ... except that the redirect for all HTTP traffic was to /, which broke discovery
  2. HTML discovery was broken.
    • while, in theory, relying parties can do all discovery using headers in practice nearly everybody starts parsing HTML at some point.
  3. Some relying parties munge up the OpenId 1.1 and 2.0 specs
    • this overlaps a bit with #2, but some relying parties are perfectly happy to do discovery with headers (OpenId 2.0) but then go hunting for openid.server in the returned HTML.

dotNetOpenAuth как одна из (по-видимому, немногих) библиотек OpenId, которая может выполнять весь танец OpenId над заголовками, по совпадению работала отлично.

person Kevin Montrose    schedule 27.04.2011