Dar*_*ere 1 c# asp.net openid dotnetopenauth
有喜欢的相当多的问题,这和这其中所有的权利ClaimedIdentifier应被用来唯一标识每个用户.
成功登录后,我将存储ClaimedIndentifier在数据库中.每当用户登录时,我遍历我的记录寻找ClaimedIdentifier.但是我发现它ClaimedIdentifiers正在改变.我应该在数据库中存储什么来识别我的用户.我正在使用Google帐户.这就是我检索将其存储到数据库中的方式
OpenIdRelyingParty rp = new OpenIdRelyingParty();
IAuthenticationResponse r = rp.GetResponse();
UserController.addUser(new UserController.User(r.ClaimedIdentifier.ToString(), 0));
Run Code Online (Sandbox Code Playgroud)
这不是DotNetOpenAuth独有的问题.这是Google的行为.Google的OpenID提供商会发布所谓的成对唯一标识符.只要您的OpenID领域是常量,它们对于给定用户将始终是相同的.
如果您在未明确向DotNetOpenAuth的OpenIdRelyingParty.CreateRequest方法提供领域的情况下登录用户,则DotNetOpenAuth只使用当前的Web应用程序根URL.这是一个合理的默认值,除非您的站点可以多种方式访问(例如http和https,或者有和没有www.主机名),默认域将根据用户碰巧使用的URL而有所不同.到达您的登录页面.当领域变化时,Google生成的声称标识符也会变化.
然后,修复是为了选择一个领域(如果这是一个选项,最好是一个具有https方案的领域)并明确地将其提供给CreateRequest方法.您还必须确保同一方法的return_to参数与您选择的领域共享一个公共根.例如,如果您选择的领域是:https:
//www.mysite.com/
那么您必须确保您的return_to基于此.类似的东西:https:
//www.mysite.com/login.aspx
如果用户浏览过http://mysite.com/login.aspx,那将是return_to的默认网址,这与您选择的领域不匹配.
总而言之,它可能看起来像这样:
var request = relyingParty.CreateRequest(
"https://www.google.com/accounts/o8/id",
"https://www.mysite.com/",
new Uri("https://www.mysite.com/login.aspx"));
Run Code Online (Sandbox Code Playgroud)
请注意,您的return_to并没有需要与为王国做每个请求完全相同.因此,您可以拥有多个登录页面URL,并且每个URL都指定自己的URL作为return_to参数.但是所有return_to URL必须基于领域URL.
随着该更改始终适用于您允许用户登录的所有位置,您应该会看到来自Google的一致声明的标识符.遗憾的是,您使用其他领域获得的声称标识符与此修复后获得的标识符不匹配.如果您需要合并这些用户帐户,并且如果您有用户的电子邮件地址,则可以尝试基于此合并.但要非常警惕这一步.只有在您确定文件中的电子邮件地址属于这些用户时,才能安全地完成此操作.如果您在用户登录时通过OpenID获取了这些电子邮件地址,并且双重检查它是来自您信任的OpenID提供商并验证电子邮件,那么您可能没问题.请注意,仅将Google OP Identifier硬编码CreateRequest并不能保证只有Google用户才能登录.为了确保这一点,您必须在肯定断言进入时检查IAuthenticationResponse.Provider.Uri属性是否匹配https://www.google.com/accounts/o8/ud.
| 归档时间: |
|
| 查看次数: |
439 次 |
| 最近记录: |