DotNetOpenAuth ClaimedIdentifier有变化吗?我应该在数据库中存储什么来识别用户

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)

And*_*ott 5

这不是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.