Пользовательские претензии с SPA, WEBAPI и Identity Server 4 с использованием oidc? - PullRequest
0 голосов
/ 26 апреля 2018

Ударяю меня об этом в течение нескольких дней.

Итак, у меня есть Identity Server 4, который является моей «аутентификацией в качестве службы», централизованным входом в систему для всех моих приложений с использованием ASP.NET Identity для управления пользователями.

На моей Клиентской стороне я использую Angular с oidc-client.js, и пока все работает должным образом, я могу получить токен идентификации пользователя и токен доступа.

Для моего WebApi (без использования.NET Core), я пытаюсь использовать UseOpenIdConnectAuthentication, чтобы я мог добавить через него специфические пользовательские утверждения приложения OpenIdConnectAuthenticationNotifications, но при вызове моего API из Angular получаю 401 Unauthorized.

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions()
{
     ResponseType = "id_token token",
     Scope = "openid profile api1",
     Authority = "http://localhost:61294/",
     ClientId = "api",
     RedirectUri = "http://localhost:56105/sigin-oidc",
     Notifications = new OpenIdConnectAuthenticationNotifications
     {
         AuthorizationCodeReceived = async n =>
         {
             // Ignore, just testing 
             var tokenClient = new TokenClient("http://localhost:61294/connect/token", "mvc");
             var tokenResponse = await tokenClient.RequestAuthorizationCodeAsync(n.Code, n.RedirectUri);
         },
         SecurityTokenValidated = async n =>
         {
             var userInfoClient = new UserInfoClient(new Uri("http://localhost:61294/connect/userinfo"), n.ProtocolMessage.AccessToken);
             var userInfo = await userInfoClient.GetAsync();

             var nId = new ClaimsIdentity(
                               n.AuthenticationTicket.Identity.AuthenticationType,
                               ClaimTypes.GivenName,
                               ClaimTypes.Role);

             userInfo.Claims.ToList().ForEach(c => nId.AddClaim(new Claim(c.Item1, c.Item2)));

             nId.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken));

             nId.AddClaim(new Claim("Test", "test"));

             n.AuthenticationTicket = new AuthenticationTicket(nId, n.AuthenticationTicket.Properties);
             n.Request.Headers.SetValues("Authorization ", "Bearer ", n.ProtocolMessage.AccessToken);
         },
         SecurityTokenReceived = async n =>
         {
             Debug.WriteLine(n);
         }
     }
 });

Я такжеЯ использовал пакет IdentityServer3.AccessTokenValidation и использую app.UseIdentityServerBearerTokenAuthentication, который работает нормально, я смог успешно вызвать свой API, но я не вижу, как я могу применить свои пользовательские требования через это.

Я подхожу к этомунеправильный способ использования app.UseOpenIdConnectAuthentication для веб-API?Любое руководство по этому вопросу будет высоко ценится.

1 Ответ

0 голосов
/ 27 апреля 2018

ОК, теперь я понял, в чем твоя проблема.Размещенная вами конфигурация Startup.cs является запуском для клиента, но вы пытаетесь использовать ее в ресурсе API.

Запуск для ресурса API должен выглядеть следующим образом здесь (я показываю один для Identity Server 3, потому что я понял, что ваш API .Net Framework).Вот почему код никогда не достигается (то, что вы упомянули в комментарии).

Честно говоря, я совершенно уверен, что вы не можете достичь того, к чему стремитесь, - добавив пользовательскую заявку в токенв ресурсе API.Ресурс API предназначен для использования и чтения уже предоставленных утверждений (в большинстве случаев авторизация API выполняется на основе утверждений).

В остальном все остальные действия выполнены правильно,Вы должны использовать IdentityServer3.AccessTokenValidation для клиентов .Net Framework и API-интерфейсов (без проблем, если эмитентом токена является IDS4).

Скорее всего, именно по этой причине вы получаете 401. Вы не правильно установили полномочиядля API.Я надеюсь, что это поможет

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