Добавление внешнего входа с Identity Server 4 и идентификатором ASP.NET

После добавления функции аутентификации с использованием Identity Server 4 с идентификатором ASP.NET я планирую добавить Поставщика Google, чтобы пользователи могли также войти в свою учетную запись google+. Я использую Angular в качестве внешнего интерфейса и ASP.NET Web Api (Core) как back-end.

// Login client
public login(email: string, password: string): Observable<any> {
    let body: any = this.encodeParams({ /* cliend_id, grant_type, username, password, scope */ });

    return this.http.post("http://localhost:64023/connect/token", body, this.options)
        .map((res: Response) => {
            const body: any = res.json();
                if (typeof body.access_token !== "undefined") {
                    // Set localStorage with id_token,..
                }
        }).catch((error: any) => { /**/ );
}

// Register Web API
[HttpPost("Create")]
[AllowAnonymous]
public async Task<IActionResult> Create([FromBody]CreateUserViewModel model)
{
    var user = new ApplicationUser
    {
        FirstName = model.FirstName,
        LastName = model.LastName,
        AccessFailedCount = 0,
        Email = model.Email,
        EmailConfirmed = false,
        LockoutEnabled = true,
        NormalizedEmail = model.Email.ToUpper(),
        NormalizedUserName = model.Email.ToUpper(),
        TwoFactorEnabled = false,
        UserName = model.Email
    };

    var result = await _userManager.CreateAsync(user, model.Password);

    if (result.Succeeded)
    {
        await addToRole(model.Email, "user");
        await addClaims(model.Email);
    }

    return new JsonResult(result);
}

// Identity Server Startup 
app.UseGoogleAuthentication(new GoogleOptions
{
    AuthenticationScheme = "Google",
    DisplayName = "Google",
    SignInScheme = "Identity.External",
    // ClientId, ClientSecret,..
});

После входа в систему пользователя localStorage устанавливается, и я могу защитить защищенные контроллеры. Для поставщика Google я добавил дополнительную кнопку и следующие методы:

initGoogleAPI() {
    let self = this;
    gapi.load('auth2', function () {
        self.auth2 = gapi.auth2.init({ /* client_id, cookiepolicy, scope */ });
        self.externalLogin(document.getElementById('google-button'));
    });
}

externalLogin(element) {
    let self = this;
    this.auth2.attachClickHandler(element, {},
        function (googleUser) {
            // retrieved the id_token, name, email,...
        }, function (error) {
        alert(JSON.stringify(error, undefined, 2));
    });
}

Я нашел несколько решений, но только для MVC-приложений, а не для SPA с использованием клиентской среды. Какие шаги я должен предпринять для внешнего входа для работы? Нужно ли создавать новую запись в таблице AspNetUsers, когда пользователь впервые подписывается с помощью внешнего поставщика?

Ответы

Ответ 1

Вы можете проверить этот репозиторий, вы можете игнорировать проект сервера ids4 и проверить клиент angular, для которого вы должны использовать клиент openid, а затем клиент перенаправляется на страницу входа в проект ids4, где вы входите в систему, и он возвращает токен, который вы сохраните, чтобы впоследствии использовать его

https://github.com/nertilpoci/Aspnetcore-identityserver4-webapi-angular

https://github.com/nertilpoci/Aspnetcore-identityserver4-webapi-angular/tree/master/ClientApp

Ответ 2

Логины должны обрабатываться идентификаторомServer4. Он должен возвращать аналогичный токен в веб-приложение независимо от локального входа или третьей стороны.

Если вам нужны данные пользователя в вашем веб-интерфейсе API, он должен передаваться вместе с претензиями.

IdentityServer4 Быстрые запуски могут быть полезны для вашего кода, у них есть пример для Внешние логины, которые вы добавляете на свой IdentityServer и как это сделать поток входа из приложение JavaScript.