我使用dotnet core v2.0.0。我已经在这篇文章之后迁移了我的身份验证:https://go.microsoft.com/fwlink/?linkid=845470
目前它看起来像这样:
public void ConfigureServices(IServiceCollection services)
{
services
.AddDbContext<DatabaseContext>()
.AddIdentity<AppUser, IdentityRole>()
.AddEntityFrameworkStores<DatabaseContext>()
.AddDefaultTokenProviders();
services
.AddAuthentication()
.AddFacebook(o => {
o.AppId = "my id";
o.AppSecret = "my secret";
});
services
.AddAuthorization()
.AddRouting()
.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider serviceProvider)
{
app.UseWebSockets();
app.UseAuthentication();
ServiceProvider = serviceProvider;
Routing.AddRoutes(app);
app.UseStaticFiles();
app.UseMvc();
}
和回调:
[Route("api/account/external")]
public async Task<IActionResult> GetExternalLogin(string provider, string error = null)
{
if (error != null)
{
return BadRequest(Uri.EscapeDataString(error));
}
// info is null
// but HttpContext.Request.Cookies does contain a cookie
var info = await _signInManager.GetExternalLoginInfoAsync();
....
}
基于表单的注册和身份验证有效。当我尝试使用 Facebook 登录时,我被重定向到登录窗口,可以输入我的密码,然后被重定向回我的应用程序。
创建一个名为 Identity.External 的 Cookie,并通过请求发送。但我的用户未通过身份验证,我没有任何声明。为什么 Identity 不使用 Cookie?如果我无法通过 SignInManager 访问它,是否有任何方法可以通过分析 cookie 来读取提供程序密钥?
我终于找到了解决方法!似乎我可以通过身份验证异步获取我需要的所有信息:
var auth = await HttpContext.AuthenticateAsync(IdentityConstants.ExternalScheme);
var principal = auth.Principal;
var providerKey = auth.Principal.Claims.FirstOrDefault();
提供者是"Facebook",providerKey.Value是提供者密钥,我可以通过身份验证获取用户名。Principal.Identity.Name。