Я вижу несколько проблем в вашем коде. Чтобы ответить на ваш прямой вопрос, причина, по которой 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 когда-либо поддерживал отправку незапрашиваемых утверждений, он будет работать на вашем сайте, и в конечном итоге ваши ворота безопасности будут именно там, где вы намеревались это делать.