오픈ID 보안:RP는 실제 공급자가 인증을 승인했는지 확인하지 않습니다.

StackOverflow https://stackoverflow.com//questions/10667627

문제

일반적인 설명

다음을 사용하여 OP(OpenID 공급자)를 구현했습니다. DotNetOpenAuth.Drupal의 OpenID 로그인 및 OpenIdRelyingPartyWebForms DotNetOpenAuth의 프로젝트 Samples 해결책.

문제는 내가 아는 한, 브라우저가 내 OP에 대해 반송되고 "성공적인 인증" 요청을 보낼 때(mode: id_res, claimed_id: smth, 등) RP로 돌아가면 RP는 OP에 대한 서버측 요청을 수행하려고 시도하지 않고 실제로 사용자를 인증했는지 묻지 않습니다.나는 거기에 있다는 것을 알 수 있다 openid.sig OP에서 서명이 반환되었지만 OP와 키를 교환하지 않았기 때문에 RP가 서명을 어떻게 확인할 수 있는지 알 수 없습니다.

질문은 다음과 같습니다. 작업 흐름을 안전하게 만들기 위해 활성화할 수 있는 OP 측 설정이 있습니까?

기술적 세부 사항

저는 Wireshark를 사용하여 RP 측에서 HTTP 트래픽을 스니핑하고 있습니다.HTTPS가 없으므로 모든 메시지를 보고 읽을 수 있습니다.아래에서 정확히 무슨 일이 일어나는지 볼 수 있습니다. = 브라우저, OP = OpenID 제공업체, RP =신뢰당사자.도메인 이름은 *.example.com으로 대체됩니다.

  1. (B –> RP) 사용자가 신뢰 당사자의 구성원 전용 리소스를 방문하려고 합니다.그는 브라우저가 RP에 게시하는 OP 엔드포인트를 입력합니다.

    openid_identifier: http://OP.example.com/OpenId/Provider.aspx?xrds

  2. (RP –> OP –> RP) RP는 XRDS 문서를 반환하는 내 OP에 서버 측 요청을 발행합니다.여기서는 비밀 키 교환과 유사한 것을 볼 수 없습니다.

    <?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/server</Type>
                <Type>http://openid.net/extensions/sreg/1.1</Type>
                <URI>http://OP.example.com/OpenId/Provider.aspx</URI>
            </Service>
        </XRD>
    </xrds:XRDS>
    
  3. (RP –> B –> OP) 신뢰 당사자 302 - 사용자를 OP로 리디렉션합니다. /OpenId/Provider.aspx?[params] 매개변수가 다음과 같은 URL:

    openid.claimed_id: http://specs.openid.net/auth/2.0/identifier_select
    openid.identity: http://specs.openid.net/auth/2.0/identifier_select
    openid.assoc_handle: {634730422000625000}{jkQC1Q==}{32}
    openid.return_to: http://RP.example.com/login.aspx?ReturnUrl=%2FMembersOnly%2FDefault.aspx&dnoa.receiver=ctl00_Main_OpenIdLogin1&dnoa.UsePersistentCookie=Session&dnoa.userSuppliedIdentifier=http%3A%2F%2FOP.example.com%2FOpenId%2FProvider.aspx%3Fxrds
    openid.realm: http://RP.example.com/
    openid.mode: checkid_setup
    openid.ns: http://specs.openid.net/auth/2.0
    openid.ns.sreg: http://openid.net/extensions/sreg/1.1
    openid.sreg.policy_url: http://RP.example.com/PrivacyPolicy.aspx
    openid.sreg.required: email,gender,postcode,timezone
    
  4. (OP –> B –> RP) 공급자는 사용자를 인증하고 다음 URL 매개변수를 사용하여 사용자를 다시 RP로 302 리디렉션합니다.

    ReturnUrl: /MembersOnly/Default.aspx
    dnoa.receiver: ctl00_Main_OpenIdLogin1
    dnoa.UsePersistentCookie: Session
    dnoa.userSuppliedIdentifier: http://OP.example.com/OpenId/Provider.aspx?xrds
    openid.claimed_id: http://OP.example.com/OpenId/User.aspx/2925
    openid.identity: http://OP.example.com/OpenId/User.aspx/2925
    openid.sig: pWJ0ugjQATKGgRSW740bml9LDsSxFiJ+a9OLO6NlsvY=
    openid.signed: claimed_id,identity,assoc_handle,op_endpoint,return_to,response_nonce,ns.sreg,sreg.nickname,sreg.email
    openid.assoc_handle: {634730422000625000}{jkQC1Q==}{32}
    openid.op_endpoint: http://OP.example.com/OpenId/Provider.aspx
    openid.return_to: http://RP.example.com/login.aspx?ReturnUrl=%2FMembersOnly%2FDefault.aspx&dnoa.receiver=ctl00_Main_OpenIdLogin1&dnoa.UsePersistentCookie=Session&dnoa.userSuppliedIdentifier=http%3A%2F%2FOP.example.com%2FOpenId%2FProvider.aspx%3Fxrds
    openid.response_nonce: 2012-05-19T16:40:11ZSfsL4BK1
    openid.mode: id_res
    openid.ns: http://specs.openid.net/auth/2.0
    openid.ns.sreg: http://openid.net/extensions/sreg/1.1
    openid.sreg.nickname: user@OP.example.com
    openid.sreg.email: user@OP.example.com
    
  5. (RP –> OP) RP는 OP에 대한 서버측 HTTP 요청을 수행합니다.데이터는 전송되지 않으며 이전에 획득한 사용자 ID URL에 대한 GET 요청만 있습니다.그런데 왜 이런 요청을 하는 걸까요?

    GET /OpenId/User.aspx/2925 HTTP/1.1
    
  6. (OP –> RP) OP는 다른 XRDS 문서로 응답합니다.

    <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>
                <Type>http://openid.net/extensions/sreg/1.1</Type>
                <URI>http://OP.example.com/OpenId/Provider.aspx</URI>
            </Service>
            <Service priority="20">
                <Type>http://openid.net/signon/1.0</Type>
                <Type>http://openid.net/extensions/sreg/1.1</Type>
                <URI>http://OP.example.com/OpenId/Provider.aspx</URI>
            </Service>
        </XRD>
    </xrds:XRDS>
    
  7. (RP –> B) 그게 다야.사용자에게 권한이 부여되고 RP는 그에게 회원 전용 리소스를 보여줍니다.

도움이 되었습니까?

해결책

RP는 다음에서 작동할 수 있습니다. 상태 저장 또는 무국적 모드(각각 스마트 모드와 멍청 모드라고도 함)확인해 보세요 각 네트워크 흐름도.

RP가 상태 저장 모드에서 작동하는 경우 RP와 OP 간에 일회성 키 교환이 있습니다.상태 비저장 모드에서는 각 인증 후 어설션의 서명을 확인하기 위해 RP에서 OP로 보내는 메시지가 표시됩니다.

#5(청구된 식별자에 대한 HTTP HEAD 요청)에 대한 질문과 관련하여 이는 OP가 주장하는 ID에 대해 권한이 있는지 확인하는 DotNetOpenAuth RP입니다.이전에 이 URL을 가져왔으므로 캐시가 시작되어 콘텐츠 전송을 방지합니다.

다른 팁

지금은 바보 같은 기분이 들어요. 기본적인 걸 놓쳤어요. ~이다 RP와 OP 간의 키 교환은 단 한 번만 발생하고 키는 한동안 양쪽에 캐시됩니다.

따라서 OpenID 공급자 구현은 안전한 것으로 나타났습니다. :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top