IdentityServer4 перемещает пользовательский интерфейс входа в систему на клиенте

Я реализую IdentityServer4 с множеством клиентов. Один из клиентов - приложение Javascript, я реализовал неявный поток для аутентификации, и все работает нормально.

В моем приложении Javascript у меня есть кнопка для входа в систему, как только я нажимаю на кнопку, я перенаправляюсь на IdentityServer, и после успешного входа в систему я перенаправляюсь обратно в свое приложение вместе с моим токеном доступа.

Теперь я хочу переместить логин на клиентскую сторону, чтобы каждое приложение могло иметь собственный пользовательский интерфейс входа (со своей собственной темой).

app.js

function log() {
    document.getElementById('results').innerText = "";

    Array.prototype.forEach.call(arguments, function (msg) {
        if (msg instanceof Error) {
            msg = "Error:" + msg.message;
        }
        else if (typeof msg !== 'string') {
            msg = JSON.stringify(msg, null, 2);
        }

        document.getElementById('results').innerHTML += msg + "\r\n";
    });
}

document.getElementById("login").addEventListener('click', login, false);
document.getElementById('api').addEventListener('click', api, false);
document.getElementById("logout").addEventListener("click", logout, false);

//configure client
var config = {
    authority: "http://localhost:5000",
    client_id: "js",
    redirect_uri: "http://localhost:5004/callback.html",
    response_type: "id_token token",
    scope: "openid profile api1 role",
    post_logout_redirect_uri: "http://localhost:5004/index.html"
};

//init user manager
var mgr = new Oidc.UserManager(config);

//check if user is logged in already

mgr.getUser().then(function (user) {
    if (user) {
        log("User logged in", user.profile);
    } else {
        log("User is not logged in.");
    }
});

function login() {
    mgr.signinRedirect();
}

function api() {
    mgr.getUser().then(function (user) {
        var url = "http://localhost:5001/identity/getfree";

        var xhr = new XMLHttpRequest();
        xhr.open("GET", url);
        xhr.onload = function () {
            log(xhr.status, JSON.parse(xhr.responseText));
        };

        xhr.setRequestHeader("Authorization", "Bearer " + user.access_token);
        xhr.send();
    });
}

function logout() {
    mgr.signoutRedirect();
}

IdentityServer StartUp.cs

 public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.
            var connectionString = "Server=localhost;port=3306;database=netcore;uid=root;Password=Liverpool1";
            services.AddApplicationInsightsTelemetry(Configuration);
            services.AddDbContext<ApplicationDbContext>(options => options.UseMySQL(connectionString));

            services.AddIdentity<ApplicationUser, IdentityRole>()
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultTokenProviders();

            services.AddMvc();

            // Add application services.
            services.AddTransient<IEmailSender, AuthMessageSender>();
            services.AddTransient<ISmsSender, AuthMessageSender>();

            services.AddIdentityServer()
                  .AddTemporarySigningCredential()
                    .AddInMemoryScopes(Config.GetScopes())
                    .AddInMemoryClients(Config.GetClients())
                  // .AddConfigurationStore(builder => builder.UseMySQL(connectionString))
                  //.AddOperationalStore(builder => builder.UseMySQL(connectionString))
                  .AddAspNetIdentity<ApplicationUser>();
        }

person muhammad waqas    schedule 02.12.2016    source источник


Ответы (1)


Это невозможно и нарушает всю суть неявного потока и всех других объединенных потоков регистрации. Вся суть неявного потока заключается в том, что вы не передаете учетные данные пользователя через клиента, а, скорее, они передаются провайдеру удостоверений.

У вас есть два варианта:

  1. Поиск способа обслуживания различных учетных записей для каждого «клиента» в ASP.NET Core.
  2. Используйте поток владельца ресурса и передайте учетные данные пользователя через клиента.

Вариант 1, вероятно, лучший, но требует дополнительной работы, вариант 2 - отговорка, а использование потока обратного осмотра - анти-паттерн.

person Lutando    schedule 02.12.2016
comment
Мой клиент использует javascript, поэтому я не могу использовать пароль владельца ресурса (так как это должен быть окончательный выбор). - person muhammad waqas; 02.12.2016
comment
какой поток вы бы предпочли в случае клиентов javascript и мобильных приложений - person muhammad waqas; 02.12.2016
comment
Извините за поздний комментарий. Для мобильных устройств используйте грант авторизации или гибрид (выберите гибрид). Для JS используйте неявный. - person Lutando; 08.12.2016
comment
Спасибо за ваше время ... так как мы не хотим мешать работе пользователей, поэтому я использую поток ResourceOwner ... - person muhammad waqas; 08.12.2016
comment
Не могли бы вы ответить на этот мой вопрос .. Я буду благодарен за http://stackoverflow.com/questions/41115373/integrating-identityserver4-with-webapi - person muhammad waqas; 13.12.2016