5

Я пытаюсь выяснить, как решить SSO (Single Sign On) с Thinktecture IdentityServer v3 для устаревшего веб-приложения. К сожалению, я сложена.Thinktecture IdentityServer v3 с WebForms и WebApi

Инфраструктура как это:

  • WebForm приложение, которое требует аутентификации и авторизации (возможно печенье или носителем маркера)
  • Javascript небольшое приложение (после аутентификации пользователя) делает запросы к WebAPI (который находится на отдельном домене)

Я имею следующие вопросы, которые, надеюсь, помогут мне принести вещи:

  1. Я не могу заставить устаревшее приложение веб-форм перенаправляться на IdentityServer, даже с установленным в Web.Config. У меня в Startup.cs приложение app.UseCookieAuthentication (....) и app.UseOpenIdConnectAuthentication (....) правильно установлено (я думаю). Для MVC атрибут [Авторизовать] принудительно перенаправляет IdentityServer. Как это сделать для веб-форм?
  2. Есть ли способ, когда пользователь вошел в систему, чтобы повторно использовать токен, хранящийся в cookie как токен-носитель, для вызовов WebApi, сделанных из клиента javascript. Я просто хочу делать запросы в WebApi от имени зарегистрированного пользователя (еще раз приложение webforms и webapi находятся в разных доменах)

Любая помощь будет высоко оценена.

Спасибо!

+0

Проверить http://bit.ly/1RNkyc9 – user960567

ответ

4

В настоящее время я работаю над одним и тем же проектом. Это то, что я обнаружил до сих пор.

Существует 4 отдельных вопроса.

  1. Сервер идентификации - поддерживает аутентификацию пользователей/клиентов/Scope
  2. WebAPI - Потребляет Токен генерируется идентификатор сервера для авторизации & идентификационной информации пользователя.
  3. WebForms/JQuery - для моего проекта в настоящее время выполняется аутентификация для существующей функциональности, перенаправляется на новый WebApi.
  4. HTML с использованием Javascript - Строго использует WebApi для информации.

Обычай грант ниже для пользователя вошедшего в через WebForm как объект членства & Я не хочу, чтобы попросить пользователя снова войти снова через идентификацию сервера.

Для прямого OAuth Authentication проверить образец здесь ..

Sample Javascript Client

Конфигурирование JavaScript неявной Flow будет работать нормально. Сохраните токен для соединения с api.

Сервер идентификации v3

Я был настроен с помощью

Custom Grant w IUserService

Custom Grants

Они покажут, как настроить проверку пользовательского гранта. С помощью службы пользователя вы можете получить запрос на идентификацию пользователя существующих пользователей &.

Существует много настроек для сервера удостоверений, чтобы сделать их собственными. это очень хорошо документировано на веб-сайте IdentityServer, в котором я не буду разбираться в том, как установить основы.

Ex: Client Configuration

return new List<Client> 
      { 
       new Client 
       { 
        ClientName = "Custom Grant Client", 
        Enabled = true, 

        ClientId = "client", 
        ClientSecrets = new List<ClientSecret> 
        { 
         new ClientSecret("secret".Sha256()), 
        }, 

        Flow = Flows.Custom, 
        CustomGrantTypeRestrictions = new List<string> 
        { 
         "custom" 
        } 
       } 
      }; 

WebAPI - Ресурс

Пример WebApi Client Sample

нужно иметь пакет NuGet

Thinktecture.IdentityServer.Acc essTokenValidation

Startup.cs

app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions 
       { 
        //Location of your identity server 
        Authority = "https://localhost:44333/core" 
       }); 

WebForms BackEnd WebForms Позвоните

Нужна NuGet Пакет

Thinktecture.IdentityModel.Client

[WebMethod] 
    [ScriptMethod(ResponseFormat.Json)] 
    public static string AuthorizeClient() 
     { 
       var client = new OAuth2Client(
       //location of identity server, ClientId, ClientSecret 
       new Uri("http://localhost:44333/core/connect/token"), 
       "client", 
       "secret"); 
      //ClientGrantRestriction, Scope (I have a Client Scope of read), Listing of claims 
      var result = client.RequestCustomGrantAsync("custom", "read", new Dictionary<string, string> 
       { 
        { "account_store", "foo" }, 
        { "legacy_id", "bob" }, 
        { "legacy_secret", "bob" } 
       }).Result; 

      return result.AccessToken; 
     } 

Эти общие претензии в этом примере, однако я могу генерировать свои собственные объекты претензии, связанные с пользователем для отправки на Сервер идентификации & регенерировать идентичности для WebAPI потреблять.

WebForms/JQuery с использованием

JQuery.cookie

$('#btnTokenCreate').click(function (e) { 

     //Create Token from User Information 
     Ajax({ 
      url: "Default.aspx/AuthorizeClient", 

      type: "POST" 
     }, 
    null, 
    function (data) { 
     sendToken = data.d; 

     //Clear Cookie 
     $.removeCookie('UserAccessToken', { path: '/' }); 

     //Make API Wrap Info in Stringify 
     $.cookie.json = true; 
     //Save Token as Cookie 
     $.cookie('UserAccessToken', sendToken, { expires: 7, path: '/' }); 

    }); 

JQuery Ajax WebAPI Sample Ajax метод - Обратите внимание на beforeSend.

function Ajax(options, apiToken, successCallback) { 
    //Perform Ajax Call 
    $.ajax({ 
     url: options.url, 
     data: options.params, 
     dataType: "json", 
     type: options.type, 
     async: false, 
     contentType: "application/json; charset=utf-8", 
     dataFilter: function (data) { return data; }, 
     //Before Sending Ajax Perform Cursor Switch 
     beforeSend: function (xhr) { 
      //Adds ApiToken to Ajax Header 
      if (apiToken) { 
       xhr.withCredentials = true; 
       xhr.setRequestHeader("Authorization", " Bearer " + apiToken); 
      } 
     }, 
     // Sync Results 
     success: function (data, textStatus, jqXHR) { 
      successCallback(data, textStatus, jqXHR); 
     }, 
     //Sync Fail Call back 
     error: function (jqXHR, textStatus, errorThrown) { 
      console.log(errorThrown); 
     } 

    }); 
} 

AngularJS

Это та же идея, как JQuery, используя

module.run(function($http) { 

    //Make API Wrap Info in Stringify 
     $.cookie.json = true; 
     //Save Token as Cookie 
     var token = $.cookie('UserAccessToken'); 
$http.defaults.headers.common.Authorization = 'Bearer ' + token }); 

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

Для поддержки CORS необходимо убедиться, что WebApi имеет Cors, настроенный для правильной работы. использовать консоль

Microsoft.AspNet.WebApi.Cors

Надеется, что это проливает некоторый свет на предмет того, как подойти к этим

+1

Спасибо Дерек, но мне в основном удалось это сделать с обработкой уведомления SecurityTokenValidated и добавлением AccessToken в качестве претензии к ClaimIdentity. После этого использование этого токена AccessToken как маркера-носителя является тривиальным в клиенте javascript. Мне также пришлось использовать пользовательскую реализацию IUserService, которая позволяет извлекать и собирать пользователей из моей существующей БД. В любом случае спасибо за подробный пример. Это было полезно. –

Смежные вопросы