我们有一个带有 ASP.NET Core Identity 的 ASP.NET Core 应用程序,我们希望用户仅通过 Google 进行身份验证(无登录表单)。
我们这样配置身份验证:
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme;
})
.AddCookie()
.AddGoogle(options =>
{
options.ClientId = Configuration["Authentication:Google:ClientId"];
options.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
});
// ....
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
// ....
这就是
HomeController
:
[Authorize]
public class HomeController : BaseController
{
public HomeController()
{
}
public IActionResult Index()
{
return View();
}
}
无需致电即可正常使用:
services.AddIdentity<User, Role>()
.AddErrorDescriber<LocalizedIdentityErrorDescriber>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
它会转到谷歌并获得身份验证,但登录谷歌似乎无法设置身份验证cookie或其他东西。
它在主页索引和谷歌之间多次保持重定向循环,然后抛出错误:
处理请求时发生未处理的异常。
AuthenticationFailureException:关联失败。未知地点AuthenticationFailureException:执行时遇到错误 处理远程登录。
如果没有google,Asp.net core身份的
AddIdentity
仍然会默认注册一个cookieschemeCookieAuthenticationDefaults.AuthenticationScheme
来使用。所以google auth需要添加另一个cookieschme。但默认情况下
AddCookie()
等于 AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
。它会与“asp.net core Identity cookie”产生冲突。你需要给它起另一个名字。并在 google auth 配置中指定新的 cookieschme。
builder.Services.AddAuthentication(
options =>
{
options.DefaultScheme = "googleAuthCookie";
options.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme;
}
).AddGoogle(googleOptions =>
{
googleOptions.ClientId = "xxx";
googleOptions.ClientSecret = "xxx";
googleOptions.SignInScheme = "googleAuthCookie";
})
.AddCookie("googleAuthCookie");