Выход IdentityServer3 с перенаправлением в ADFS
У меня IdentityServer3 настроен на использование как служб федерации Active Directory, так и поставщиков внутренней проверки подлинности. По примерам все работает отлично.
Однако, когда вы входите в /identity и пытаетесь выйти из системы с помощью Request.GetOwinContext().Authentication.SignOut() в контроллере выхода из системы, сайт перенаправляется в /adfs/logout. При входе в / adfs и выходе из системы он также перенаправляется в /adfs/logout.
Что является причиной этого?
Также - основной клиент зарегистрирован по внешнему доступному URL (например, www.prettyurl.com). IdentityServer размещается отдельно по внутреннему URL-адресу (например, www.lesspretty-internal-stuff.com). Естественно, я не хочу, чтобы посетители видели этот внутренний URL, но в настоящее время при перенаправлении на шаблон входа в систему пользователи видят www.lesspretty-internal-stuff.com/identity/login. Как лучше всего убедиться, что пользователи видят www.prettyurl.com/identity/login?
Ниже приведена конфигурация для регистрации клиента ADFS:
{
"Enabled": true,
"ClientId": "SiteA.adfs",
"ClientSecrets": [
{
"Description": null,
"Value": "NvD0tgVqxNCkt9u3yUWXwdRMnWyE3DcBId7tveUElWA=",
"Expiration": null,
"Type": "SharedSecret"
}
],
"ClientName": "SiteA",
"ClientUri": null,
"LogoUri": null,
"RequireConsent": false,
"AllowRememberConsent": false,
"Flow": 2,
"AllowClientCredentialsOnly": false,
"RedirectUris": [
"https://myadfs.com/"
],
"PostLogoutRedirectUris": [
"https://myadfs.com/"
],
"LogoutUri": null,
"LogoutSessionRequired": true,
"RequireSignOutPrompt": false,
"AllowAccessToAllScopes": true,
"AllowedScopes": [
"openid",
"profile",
"email",
"roles"
],
"IdentityTokenLifetime": 360,
"AccessTokenLifetime": 3600,
"AuthorizationCodeLifetime": 300,
"AbsoluteRefreshTokenLifetime": 2592000,
"SlidingRefreshTokenLifetime": 1296000,
"RefreshTokenUsage": 1,
"UpdateAccessTokenClaimsOnRefresh": false,
"RefreshTokenExpiration": 1,
"AccessTokenType": 0,
"EnableLocalLogin": false,
"IdentityProviderRestrictions": [
"adfs"
],
"IncludeJwtId": false,
"Claims": [
],
"AlwaysSendClientClaims": true,
"PrefixClientClaims": true,
"AllowAccessToAllCustomGrantTypes": false,
"AllowedCustomGrantTypes": [
],
"AllowedCorsOrigins": [
],
"AllowAccessTokensViaBrowser": true}
Ниже приведена конфигурация для регистрации клиента IDENTITY:
{
"Enabled": true,
"ClientId": "SiteB.identity",
"ClientSecrets": [
{
"Description": null,
"Value": "NvD0tgVqxNCkt9u3yUWXwdRMnWyE3DcBId7tveUElWA=",
"Expiration": null,
"Type": "SharedSecret"
}
],
"ClientName": "SiteB",
"ClientUri": null,
"LogoUri": null,
"RequireConsent": false,
"AllowRememberConsent": false,
"Flow": 2,
"AllowClientCredentialsOnly": false,
"RedirectUris": [
"https://myid.com/"
],
"PostLogoutRedirectUris": [
"https://myid.com/"
],
"LogoutUri": null,
"LogoutSessionRequired": true,
"RequireSignOutPrompt": false,
"AllowAccessToAllScopes": true,
"AllowedScopes": [
"openid",
"profile",
"email",
"roles"
],
"IdentityTokenLifetime": 360,
"AccessTokenLifetime": 3600,
"AuthorizationCodeLifetime": 300,
"AbsoluteRefreshTokenLifetime": 2592000,
"SlidingRefreshTokenLifetime": 1296000,
"RefreshTokenUsage": 1,
"UpdateAccessTokenClaimsOnRefresh": false,
"RefreshTokenExpiration": 1,
"AccessTokenType": 0,
"EnableLocalLogin": true,
"IdentityProviderRestrictions": [
"Google",
"idsrv"
],
"IncludeJwtId": false,
"Claims": [
],
"AlwaysSendClientClaims": true,
"PrefixClientClaims": true,
"AllowAccessToAllCustomGrantTypes": false,
"AllowedCustomGrantTypes": [
],
"AllowedCorsOrigins": [
],
"AllowAccessTokensViaBrowser": true}
Запуск в IdentityServer:
public void ConfigureAuth(IAppBuilder app)
{
app.Map("/identity", idsrvApp =>
{
Log.Information("Bouncer {Now}: Identity configuration", DateTime.Now);
var factory =
new IdentityServerServiceFactory()
.UseInMemoryClients(Clients.Get())
.UseInMemoryScopes(Scopes.Get());
var userService = new UserService();
factory.UserService = new Registration<IUserService>(resolver => userService);
var viewOptions = new DefaultViewServiceOptions()
{
CacheViews = false,
CustomViewDirectory = basePath + "templates\\myAccount" // This must be the full filesystem path to the directory
};
factory.ConfigureDefaultViewService(viewOptions);
idsrvApp.UseIdentityServer(new IdentityServerOptions
{
SiteName = "mysite",
SigningCertificate = LoadCertificate(),
Factory = factory,
RequireSsl = true,
CspOptions = new IdentityServer3.Core.Configuration.CspOptions
{
Enabled = EnableCSP,
ScriptSrc = cspScript,
StyleSrc = cspStyle,
ImgSrc = cspImg,
FontSrc = cspFont,
ConnectSrc = cspConnect
},
AuthenticationOptions = new IdentityServer3.Core.Configuration.AuthenticationOptions
{
EnablePostSignOutAutoRedirect = true,
IdentityProviders = ConfigureIdentityProviders,
LoginPageLinks = new List<LoginPageLink>()
{
new LoginPageLink()
{
Href = "resetpassword",
Text = "Forgot your password?",
Type = "resetPassword"
}
}
}
});
});
app.Map("/adfs", coreApp =>
{
var factory =
new IdentityServerServiceFactory()
.UseInMemoryClients(Clients.Get())
.UseInMemoryScopes(Scopes.Get());
var viewOptions = new DefaultViewServiceOptions()
{
CacheViews = false,
CustomViewDirectory = basePath + "templates\\myadaccount" // This must be the full filesystem path to the directory
};
factory.ConfigureDefaultViewService(viewOptions);
factory.UserService = new Registration<IUserService>(typeof(ExternalRegistrationUserService));
var options = new IdentityServerOptions
{
SiteName = "myADSite,
SigningCertificate = LoadCertificate(),
Factory = factory,
RequireSsl = true,
CspOptions = new IdentityServer3.Core.Configuration.CspOptions
{
Enabled = EnableCSP,
ScriptSrc = cspScript,
StyleSrc = cspStyle,
ImgSrc = cspImg,
FontSrc = cspFont,
ConnectSrc = cspConnect
},
AuthenticationOptions = new IdentityServer3.Core.Configuration.AuthenticationOptions
{
EnableLocalLogin = false,
IdentityProviders = ConfigureWSFedProvider
}
};
coreApp.UseIdentityServer(options);
});
}
}