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.