Проблемы с AuthenticateAsyn c при входе в Facebook в ASP. NET Core - PullRequest
0 голосов
/ 19 февраля 2020

У меня проблема с включением аутентификации Facebook в моем ASP. NET Базовом веб-приложении. Я использую ASP. NET Core Authentication, но not Identity. Аутентификация в автозагрузке настраивается следующим образом:

services
    .AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    })
    .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddFacebook(options =>
    {
        options.ClientId = "clientid";
        options.ClientSecret = "secret";
        options.CallbackPath = "/signinfacebookcallback";
    });

Как показано в коде, я хочу использовать cook ie auth, но также разрешать людям входить через Facebook. После успешного входа в систему я хочу установить auth cook ie.

. Чтобы показать вызов, у меня есть следующее действие:

[HttpGet]
[Route("signinfacebook")]
public ActionResult SignInFacebook()
{
    return Challenge(FacebookDefaults.AuthenticationScheme);
}

Это перенаправляет пользователя на экран входа в Facebook. После входа в систему пользователь перенаправляется на URL-адрес, указанный в конфигурации:

[HttpGet]
[Route("signinfacebookcallback")]
public async Task<ActionResult> SignInFacebookCallback()
{
    var result = await HttpContext.AuthenticateAsync();
    if (!result.Succeeded) return Redirect("/login/");

    ...
}

Когда я отлаживаю код, result.Succeeded возвращает false, а объект AuthenticationResult не содержит дополнительной информации о том, почему Succeeded неверно.

Я проверил правильность идентификатора приложения и его секрета.

В чем здесь проблема?

1 Ответ

1 голос
/ 19 февраля 2020

CallbackPath в промежуточном программном обеспечении OpenID Connect - это внутренний путь, используемый для проверки подлинности протокола OpenID Connect. После того, как провайдер Identity перенаправит пользователя на этот URL-адрес в вашем приложении, промежуточное ПО будет обрабатывать оценку токенов, декодировать токен, обмениваться токенами и, наконец, заполнять принцип пользователя, и этот процесс запускается до того, как ваш контроллер подключается.

С CallbackPath является внутренним и будет обрабатываться промежуточным программным обеспечением OpenID Connect автоматически, вам не нужно об этом заботиться, убедитесь, что обратный вызов зарегистрирован в разрешенном URL-адресе перенаправления Facebook и разрешите промежуточному программному обеспечению обрабатывать обратный вызов. Если вы хотите перенаправить пользователя на указанный c route / page после аутентификации, установите URL-адрес на AuthenticationProperties:

if (!User.Identity.IsAuthenticated)
{
    return Challenge(new AuthenticationProperties() { RedirectUri = "/home/Privacy" } ,FacebookDefaults.AuthenticationScheme);
}

И вы должны удалить маршрут обратного вызова (signinfacebookcallback) в вашем приложении.

UPDATE

Если вы хотите получить доступ к базе данных и управлять локальным пользователем, вы можете использовать встроенные события в промежуточном программном обеспечении, для AddFacebook промежуточного программного обеспечения вы можете использовать OnTicketReceived для добавления базы данных доступа, управления пользователями и добавить претензии к принципу пользователя:

.AddFacebook(options =>
{
    options.ClientId = "xxxxxxxxxxxxx";
    options.ClientSecret = "xxxxxxxxxxxxxxxxxxxx";
    options.CallbackPath = "/signinfacebookcallback";
    options.Events = new OAuthEvents
    {
        OnTicketReceived = ctx =>
        {

            //query the database to get the role
            var db = ctx.HttpContext.RequestServices.GetRequiredService<YourDbContext>();
            // add claims
            var claims = new List<Claim>
            {
                new Claim(ClaimTypes.Role, "Admin")
            };
            var appIdentity = new ClaimsIdentity(claims);

            ctx.Principal.AddIdentity(appIdentity);

            return Task.CompletedTask;
        },
    };
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...