使用dotNetOpenAuth时"记住此批准",Google Apps无法按预期工作

ron*_*ron 2 google-apps dotnetopenauth oauth-2.0

我正在使用dotNetOpenAuth通过用户的Google Apps帐户向我的应用提供SSO.除了简单的身份验证,我还要求Google返回用户的电子邮件,名字和姓氏.当用户第一次进入时,他们会被重定向到典型的Google帐户页面,告诉他们该应用程序正在询问此信息,并且他们是否希望允许该信息.那里有复选框以记住此批准.问题是,批准不被记住.如果他们在不关闭浏览器的情况下返回网站,它会记住它们.但是如果他们关闭浏览器然后再打开它并重新进入,他们会再次被提示允许它.

如果我查看显示已关联网站,应用和服务的Google帐户页面,我会多次看到我的应用列表.它就像它不认识它是相同的应用程序并继续添加它.

我知道我必须遗漏一些明显的东西,但我不确定它是什么.有任何想法吗?

谢谢!

你可以在这里找到我的代码

And*_*ott 5

我在你的代码中看到了几个问题.要首先回答您的直接问题,Google在回访时不记得您的原因是因为您每次登录时都会在您的Realm中传递随机GUID.这个症状实际上比您意识到的要糟糕得多.这不仅仅是Google提示用户进行回访,您的网站在回访时根本无法识别用户,因为Google会在每次访问时为他们提供新的声明标识符.

修复是你应该为每个登录请求使用完全相同的Realm:

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

或者我个人最喜欢的:

var req = openid.CreateRequest(discoveryUri, Realm.AutoDetect, URIbuilder.Uri );
Run Code Online (Sandbox Code Playgroud)

Realm.AutoDetect会为你工作,除非你的网站可以通过HTTP和HTTPS,在这种情况下,你需要将其锁定到只有一个或其他的这些让谷歌承认你的网站总是相同的.

您还必须记住,作为第3个参数传入的returnTo URL CreateRequest必须始终基于领域.因此,如果您的领域是HTTPS,那么您的returnTo参数也必须如此.

我还想提一下,你似乎有一些GUID代码和复杂的URL操作,试图确保你接受的每个OpenID响应来自你发出的请求.我不确定你为什么要首先尝试这样做,尽管肯定有合理的理由.你这样做的方式是不安全的,可以规避.我建议你删除所有这些代码,支持将其添加到你的web.config文件中:

<dotNetOpenAuth>
    <openid>
        <relyingParty>
            <security rejectUnsolicitedAssertions="true" />
        </relyingParty>
    </openid>
</dotNetOpenAuth>
Run Code Online (Sandbox Code Playgroud)

该库支持要求所有响应来自您内置的请求,并且它安全地执行,以便我之前提到的安全漏洞是不可能的.

但是,如果您只是尝试应用此限制,以便您知道它来自Google,我可以建议您IAuthenticationResponse.Provider.Uri在收到回复时检查属性,而不是拒绝未经请求的断言,并验证它是否来自Google OP端点?然后,如果谷歌曾支持发送未经请求的断言,它将在您的网站上运行,并且最终您的安全门正是您打算成为的目标.