Как делегировать Identity из веб-приложения в WebAPI

Я пытаюсь создать веб-сайт, на котором пользователь входит в систему и может использовать внутренний веб-API.

Вызовы внутреннего веб-API всегда будут проксироваться внешним веб-сайтом, так как серверная часть не является общедоступной. Back- и frontend — это проекты MVC 6 (или MVC Core?), основанные на ASP.net Core.

Интерфейс в настоящее время проходит аутентификацию (успешно) с помощью OpenId-Connect. Серверная часть должна использовать JwtBearerToken.

Аутентификация до сих пор запрашивает тип ответа id_token code и область действия openid profile.

После обращения к Auth-Server (ADFS 2016) я попаду в событие AuthorizationCodeReceived из ASP.NET, но мне не удастся обменять код на токен авторизации. Я попробовал следующее с помощью ADAL:

public override async Task AuthorizationCodeReceived(AuthorizationCodeReceivedContext context)
        {
            await base.AuthorizationCodeReceived(context);

            var clientCredential = new ClientCredential(context.Options.ClientId, context.Options.ClientSecret);

            var oAuthContext = new AuthenticationContext(context.Options.Authority, false);
            var oAuthResult = await oAuthContext.AcquireTokenByAuthorizationCodeAsync(context.Code, new Uri(context.RedirectUri), clientCredential);
        }

Мне пришлось отключить проверку полномочий (что мне не нравится), и я не получаю никаких результатов, кроме Http-Status 400.
Буду рад любому совету, как двигаться дальше.

Обновление
Дальнейшее исследование показывает, что конфигурация OpenIdConnect позволяет сохранять аутентификацию и обновлять токены в утверждениях. Тем не менее, я не вижу возможности конвертировать его в первую очередь.
Я также пытался заменить код вручную (PS: Invoke-WebRequest ...), но безуспешно. Возможно, это проблема ADFS TP4...


person TGlatzer    schedule 09.02.2016    source источник
comment
Начиная с ASP.Net Core RC2, это работает автоматически.   -  person TGlatzer    schedule 08.06.2016


Ответы (1)


Мне удалось заставить этот сценарий работать с TP4.

AuthorizationCodeReceived = async n =>
{
   string code = n.Code;

   AuthenticationContext ac = new AuthenticationContext(BaseAddress, false);
   ClientCredential client = new ClientCredential("clientid", "secret");
   string resourceId = "https://myservices/myapi";
   AuthenticationResult ar = await ac.AcquireTokenByAuthorizationCodeAsync(code, new Uri("https://localhost:44300/"), client, resourceId);
}

Затем вы можете использовать токен доступа из метода контроллера следующим образом:

AuthenticationContext ac = new AuthenticationContext(Startup.BaseAddress, false);
ClientCredential cred = new ClientCredential("clientid", "secret");
string resourceId = "https://myservices/myapi";
AuthenticationResult ar = ac.AcquireTokenSilent(resourceId, cred, UserIdentifier.AnyUser);


var client = new HttpClient();
client.SetBearerToken(ar.AccessToken);

var result = await client.GetStringAsync("http://localhost:2727/identity");
person solidstore    schedule 17.02.2016
comment
Хм... это выглядит знакомо - можете ли вы добавить информацию, какой здесь BaseAddress? - person TGlatzer; 17.02.2016
comment
Начиная с RC2, OpenIdConnect от Asp.Net Core будет делать это автоматически. - person TGlatzer; 08.06.2016