我使用身份验证提供程序创建了一个ASP.Net Core 2.0 MVC,如下所述:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/
在localhost上(即通过Visual Studio 2017运行时)一切正常。但是,在部署到Azure后,我发现登录提供程序停止工作(尽管我设置了适当的回调URI;例如,对于Google我有https://localhost:44357/signin-google
,但https://mysite.azurewebsites.net/signin-google
,https://example.com/signin-google
和{{ 1}}(以及在Azure中设置https://www.example.com/signin-google
域及其example.com
子域,并配置了涵盖这些域的SSL。)对于Twitter,我已将设置更改为仅限于www子域(因为只允许1个回调URL),对于LinkedIn我只有域和子域(即我必须删除localhost;因为LinkedIn只允许在单个域下回调URI)。我'我还配置了Azure App Service www
下secrets.json
中的那些键/值。
首次登录(也称为注册)时,用户点击相关提供商的按钮,然后在Application Settings
和AspNetUsers
表格中显示新的用户条目,并将用户定向到他们可以关联他们的电子邮件的页面但是,他们当时没有登录;刚注册。随后的尝试将他们带回电子邮件注册表单;只需单击AspNetUserLogins
按钮,然后返回一条错误消息,指出电子邮件已经注册(这是正确的);但用户仍未登录该网站。
我对所有提供商都有同样的问题;虽然在证明了我的大部分时间都集中在Google上之后,只是为了限制更改变量的数量。
我从该示例中做出的唯一重大改变是在Register
中重构代码,以便将每个提供程序封装在其自己的方法中;所以Startup.cs
包含:
ConfigureServices
......这些方法看起来像这样:
ConfigureServicesAuthFacebook(services);
ConfigureServicesAuthGoogle(services);
ConfigureServicesAuthTwitter(services);
ConfigureServicesAuthMicrosoft(services);
ConfigureServicesAuthLinkedIn(services);
如果我无法在localhost上重新创建问题,我该如何调试此问题。关于问题的任何提示?
答案 0 :(得分:1)
它的工作方式是您的用户首先必须与您系统上的用户分配他们的Google帐户。听起来这对你有用。
完成此操作后,您的代码应该预先形成某种ExternalLoginSignInAsync
,但这取决于您如何设置系统。
开箱即用,IsNotAllowed
为true
,这意味着尚未确认与该帐户关联的电子邮件或电话号码尚未确认。见ASN.NET Core 2.0 Facebook authentication ExternalLoginSignInAsync Fails (IsNotAllowed)
查看AccountController
方法ExternalLoginConfirmation
,您会看到:
var user = new ApplicationUser(model.Email) { Email = model.Email };
假设您对注册现有登录提供程序的用户感到高兴,请将其修改为:
var user = new ApplicationUser(model.Email) { Email = model.Email, EmailConfirmed = true };