MitreId OpenID Connect Server, используя в угловых и.net веб-приложения

Я работаю над проектом, который имеет угловой интерфейс Frontend и Backend API в asp.net WebAPI. Есть сервер OpenId Connect (mitreid), который размещен, и я должен использовать этот сервер для аутентификации и авторизации.

Я пытаюсь настроить аутентификацию сервера OpenId Connect на.net WebAPI, это то, что я сделал в StartUp.cs WebAPI

app.SetDefaultSignInAsAuthenticationType("OpenIdConnect");
app.UseOpenIdConnectAuthentication(
               new OpenIdConnectAuthenticationOptions
               {
                   ClientId = "some_client",
                   ClientSecret = "some_secret",
                   Authority = "http://localhost:8181/openid-connect-server-webapp",                      
                   UseTokenLifetime = true,
                   ResponseType = "code",
                   Scope = "openid email",
                   SignInAsAuthenticationType = "OpenIdConnect",
                   TokenValidationParameters = new TokenValidationParameters
                   {
                       ValidateIssuer = false,
                       ValidateAudience = false
                   },
                   Notifications = new OpenIdConnectAuthenticationNotifications()
                   {
                       AuthorizationCodeReceived = (context) =>
                       {
                           var code = context.Code;
                           return Task.FromResult(0);
                       },
                       RedirectToIdentityProvider = async n =>                       
                       {
                           n.ProtocolMessage.RedirectUri = "http://localhost:54464/";
                           n.OwinContext.Authentication.Challenge(new String[] { "OpenIdConnect" });
                       },
                       SecurityTokenValidated = (n) =>
                       {
                           var nid = new ClaimsIdentity(n.AuthenticationTicket.Identity.AuthenticationType, "user", "user");                                  
                           nid.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken));
                           nid.AddClaim(new Claim("access_token", n.ProtocolMessage.AccessToken));    
                           nid.AddClaim(new Claim("expires_at", DateTimeOffset.Now.AddSeconds(int.Parse(n.ProtocolMessage.ExpiresIn)).ToString()));
                           nid.AddClaim(new Claim("app_specific", "some data"));
                           n.AuthenticationTicket = new AuthenticationTicket(nid, n.AuthenticationTicket.Properties);
                           return Task.FromResult(0);
                       },
                       SecurityTokenReceived = (context) =>
                       {
                           var code = context;    
                           return Task.FromResult(0);
                       },
                       AuthenticationFailed = (context) =>
                       { 
                           //some redirect
                           context.HandleResponse(); 
                           return Task.FromResult(0);
                       }
                   }
               });

Я попытался установить конфигурацию даже, как показано ниже

ConfigurationManager = 
new ConfigurationManager<OpenIdConnectConfiguration>
    ("http://localhost:8181/openid-connect-server-webapp/.well-known/openid-configuration"),
Configuration = new OpenIdConnectConfiguration
{
    Issuer = "http://localhost:8181/openid-connect-server-webapp",
    AuthorizationEndpoint = "http://localhost:8181/openid-connect-server-webapp/authorize",
    TokenEndpoint = "http://localhost:8181/openid-connect-server-webapp/token",
    UserInfoEndpoint = "http://localhost:8181/openid-connect-server-webapp/userinfo"
},

Когда я пытаюсь отладить API (на порту 54464), я помещаю authorize attr на контроллер, он перенаправляет на страницу входа OpenID, а затем после успешного входа в систему, а затем не выполняет никаких действий контроллера. скажем, это вызов API, который я тестирую http://localhost:54464/api/common/getlist Первоначально для первого вызова API перенаправляет на страницу входа в систему, а затем перенаправляет на http://localhost:54464/api/common/getlist/?code=V7KFPZ&state=OpenIdConnect.AuthenticationProperties%3D****somecode**** вместо того, чтобы возвращать массив JSON.

Я попытался сгенерировать токен Bearer, используя код из перенаправленного выше URL-адреса от почтальона, что оказалось успешным. однако, если попытаться использовать токен в заголовке авторизации с помощью почтальона, ответом будет HTML-страница входа OpenID.

Проблема не выполняется ни одно из событий уведомления, кроме RedirectToIdentityProvider

Я знаю, что что-то упустил, пожалуйста, укажите мне это, я довольно новичок в этом. дайте мне знать, если я делаю что-то не так, некоторые ошибки конфигурации или какие-либо решения, реализующие клиент OpenId.

1 ответ

Как указано в комментарии выше, поток кода авторизации не очень подходит для клиентов Javascript, таких как приложения Angular. Поэтому это описывает возможную настройку для неявного потока

Вот как вы могли бы подойти к этому с популярными библиотеками:

Сервер авторизации (Mitreid): я ничего не знаю о Mitreid, но вы должны зарегистрировать свое клиентское приложение с ID some_client или измените существующую конфигурацию клиента, чтобы использовать поток последствий. В некоторых реализациях, таких как Identity Server, потребуется дополнительный параметр, позволяющий передавать маркеры доступа в браузер. Также убедитесь, что вы зарегистрировали http://YOUR_ANGULAR_APP/auth-callback как URI перенаправления. Вы также можете зарегистрировать область для своего приложения WebApi, чтобы оно могло использовать маркеры доступа. Я предполагаю, что у вас есть область под названием webapi, Я также предполагаю, что вы будете использовать JWT, а не эталонные токены. В последнем случае конфигурация WebAPI немного отличается.

Клиент (угловой): я рекомендую oidc-client Библиотека, которую вы можете установить через NPM. Вот руководство, как интегрировать его в Angular: https://www.scottbrady91.com/Angular/SPA-Authentiction-using-OpenID-Connect-Angular-CLI-and-oidc-client. Я обновил настройки в соответствии с вашими примерами:

export function getClientSettings(): UserManagerSettings {
    return {
        authority: 'http://localhost:8181/openid-connect-server-webapp',
        client_id: 'some_client',
        redirect_uri: 'http://YOUR_ANGULAR_APP/auth-callback',
        post_logout_redirect_uri: 'http://YOUR_ANGULAR_APP/',
        response_type:"id_token token",
        scope:"openid email webapi",
        filterProtocolClaims: true,
        loadUserInfo: true
   };
}

Приложение Angular запустит процедуру входа в систему, которая предоставит вам токен ID и токен доступа, если все работает правильно. oidc-client также готовит Authorization заголовок с токеном доступа, который вы должны добавить ко всем авторизованным запросам к вашему приложению WebAPI. oidc-client также автоматически загружает заявки пользователей.

Ресурсный сервер (приложение WebAPI): реализация на стороне WebAPI довольно проста, так как вам просто нужно добавить промежуточное ПО для проверки маркеров доступа и [Authorize] атрибутов. Для pre-ASP.NET Core приложений, которые мне нравится использовать IdentityServer3.AccessTokenValidation, который вы можете установить через Nuget.

app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
        {
            Authority = "http://localhost:8181/openid-connect-server-webapp",
            RequiredScopes = "openid email webapi"
        });

Если вы добавите [Authorize] конечную точку вашего WebAPI вы должны получить ClaimsIdentity как User на основании претензий, содержащихся в JWT.

Другие вопросы по тегам