2012-06-28 1 views
2

Я использую dotNetOpenAuth для предоставления единого входа в свое приложение через учетную запись пользователя Google Apps. Помимо простой проверки подлинности, я также прошу Google вернуть электронную почту, имя и фамилию пользователя. Когда пользователь сначала входит, они перенаправляются на обычную страницу учетных записей Google, сообщая им, что приложение запрашивает эту информацию и хочет ли она ее разрешить. Там есть флажок, чтобы запомнить это утверждение. Проблема в том, что утверждение не запоминается. Он помнит их, если они вернутся на сайт, не закрывая свой браузер. Но если они закрывают свой браузер, а затем открывают его позже и возвращаются, им снова предлагается его разрешить.«Помните это утверждение» при использовании dotNetOpenAuth и Google Apps не работает должным образом

Если я просматриваю страницу своей учетной записи Google, которая показывает мне подключенные сайты, приложения и службы, я вижу, что мое приложение перечислено несколько раз. Это похоже на то, что он не признает, что это одно и то же приложение и продолжает его добавлять.

Я знаю, что, должно быть, мне не хватает чего-то очевидного, но я не уверен, что это такое. Есть идеи?

Спасибо!

Вы можете найти мой код here

ответ

5

Я вижу несколько проблем в вашем коде. Чтобы ответить на ваш прямой вопрос, причина, по которой Google не помнит вас при обратных посещениях, заключается в том, что каждый раз, когда вы входите в систему, вы передаете случайный идентификатор GUID как часть вашего Королевства. Симптом на самом деле намного хуже, чем вы понимаете. Дело не только в том, что Google запрашивает пользователя при обратных посещениях, ваш сайт не узнает пользователя вообще при обратных посещениях, потому что Google предоставит им новый заявленный идентификатор при каждом посещении.

Исправление в том, что вы должны использовать один и тот же Realm для каждого запроса авторизации:

Realm realm = "http://www.yoursite.com/"; 
var req = openid.CreateRequest(discoveryUri, realm, URIbuilder.Uri); 

или мой личный фаворит:

var req = openid.CreateRequest(discoveryUri, Realm.AutoDetect, URIbuilder.Uri); 

Realm.AutoDetect будет работать для вас, если ваш сайт не доступен оба - через HTTP и HTTPS, и в этом случае вам нужно заблокировать его до одного или другого из них, чтобы Google распознавал ваш сайт как всегда одинаковый.

Вы также должны помнить, что URL-адрес returnTo, который вы передаете в качестве третьего параметра в CreateRequest, должен всегда основываться на области. Поэтому, если ваше пространство HTTPS, так что должен быть ваш параметр returnTo.

Я также хочу назвать, что у вас, похоже, есть GUID-код и сложная манипуляция URL-адресов, пытаясь гарантировать, что каждый ответ OpenID, который вы принимаете, поступает из отправленного вами запроса. Я не уверен, почему вы пытаетесь это сделать в первую очередь, хотя, безусловно, могут быть законные причины. То, как вы это делали, небезопасно и может быть обойдено. Я предлагаю вам удалить весь этот код, в пользу добавив в файл web.config:

<dotNetOpenAuth> 
    <openid> 
     <relyingParty> 
      <security rejectUnsolicitedAssertions="true" /> 
     </relyingParty> 
    </openid> 
</dotNetOpenAuth> 

Библиотека поддерживает требование, чтобы все ответы приходят от ваших запросов, построенных в, и делает это таким образом, чтобы надежно ранее я не упоминал об использовании безопасности, о котором я упоминал ранее.

Но если вы только пытаетесь применить это ограничение, чтобы вы знали, что оно исходит от Google, могу ли я рекомендовать вместо того, чтобы отклонять незапрашиваемые утверждения, вместо этого вы проверяете свойство IAuthenticationResponse.Provider.Uri, когда получаете ответы и проверяете, что он наступает от конечной точки Google OP? Затем, если Google когда-либо поддерживал отправку незапрашиваемых утверждений, он будет работать на вашем сайте, и в конечном итоге ваши ворота безопасности будут именно там, где вы намеревались это делать.