При объединении удостоверений ASP.NET и OAuth необходимо учитывать следующие факторы:
Настройка услуг:
Добавление AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
больше не требуется, поскольку Identity добавляет свои собственные обработчики файлов cookie.
Получение внешнего пользователя в качестве ClaimsPrincipal:
Если вы хотите, чтобы внешний пользователь был заполнен под HttpContext.User
, сделайте следующее:
.AddFacebook(options => {
options.SignInScheme = IdentityConstants.ApplicationScheme;
})
После перенаправления на RedirectUri
в вашем вызове AuthenticationProperties
ваш HttpContext.User
будет заполнен.
Получение внешнего пользователя как ExternalLoginInfo
:
Это предпочтительно, если вам нужно знать что-то о пользователе, например:
- От какого провайдера они пришли?
- Какой у них уникальный ключ у провайдера?
Ваши сервисы должны быть настроены так:
services.AddAuthentication()
.AddFacebook(options =>
{
options.AppId = "";
options.AppSecret = "";
});
services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<MyDbContext>();
В вашем контроллере входа введите SignInManager<TUser>
in:
public DefaultController(SIgnInManager<IdentityUser> signInManager)
А в вашем задании на вызов используйте ConfigureExternalAuthenticationProperties
, чтобы получить свойства задания:
public IActionResult LoginExternal() {
var props = SignInManager.ConfigureExternalAuthenticationProperties("Facebook", "/");
return Challenge(props, "Facebook");
}
В ответном действии используйте GetExternalLoginInfoAsync
, чтобы получить внешние данные о пользователе:
public async Task<IActionResult> LoginCallback() {
var loginInfo = await SignInManager.GetExternalLoginInfoAsync();
// This object will tell you everything you need to know about the incoming user.
}