Я работаю над авторизацией с помощью IdentityServer3, и мне нужно настроить его конфигурацию для разных сред: dev, staging и так далее. Поэтому мне нужны настраиваемые URL-адреса перенаправления, сертификат и т. д., но я не могу найти средства для этого. Насколько я понимаю, в IS3 нет пользовательского интерфейса администратора, и для него нет плана. Нужно ли мне создавать собственную систему конфигурации?
Пользовательский интерфейс администратора IdentityServer3
Ответы (2)
Адекватного решения не нашел. Закончилось созданием пользовательского config.json и чтением настроек оттуда.
Я оставляю код здесь. На всякий случай...
public class AuthConfiguration
{
private static readonly Lazy<AuthConfiguration> _instance = new Lazy<AuthConfiguration>(LoadConfig);
public static AuthConfiguration Instance
{
get { return _instance.Value; }
}
private AuthConfiguration()
{
}
private static AuthConfiguration LoadConfig()
{
string jsonString;
using (var r = new StreamReader(HttpRuntime.BinDirectory + "auth.config.json"))
{
jsonString = r.ReadToEnd();
}
return JsonConvert.DeserializeObject<AuthConfiguration>(jsonString);
}
public string AuthServerUrl { get; set; }
public AuthCertificate Certificate { get; set; }
public string[] CorsAllowedOrigins { get; set; }
public Dictionary<string, AuthClient> Clients { get; set; }
#region Helper classes
public class AuthCertificate
{
public string File { get; set; }
public string Password { get; set; }
}
public class AuthClient
{
public List<string> RedirectUris { get; set; }
public List<string> PostLogoutRedirectUris { get; set; }
public string[] Secrets { get; set; }
}
#endregion Helper classes
}
Я пытался сделать это сам, и пришел к такому выводу. На самом деле вы можете редактировать только «основной» интерфейс, чтобы сделать это, используя свойство «ViewService» в вашем конвейере, что-то вроде этого:
var factory = new IdentityServerServiceFactory();
factory.ViewService = new CustomView();
app.Map("/identity", id => {
id.UseIdentityServer(new IdentityServerOptions {
SiteName = "Demo Identity Server",
IssuerUri = (string)ConfigurationManager.AppSettings["options.issuerUri"],
Factory = factory,
SigningCertificate = LoadCertificate()
});
});
CustomView реализует IViewService, здесь вам нужно реализовать свои собственные методы для редактирования вашего представления.
(Configure — это расширенный метод, в котором я реализую настройку всего конвейера, выполняя принципы SOLID и разделяя обязанности)
public void Configuration(IAppBuilder app) {
string connectionString = ConfigurationManager.ConnectionStrings["cnn"].ConnectionString;
var factory = new IdentityServerServiceFactory();
factory.ViewService = new CustomView();
app.Map("/identity", id => {
id.UseIdentityServer(new IdentityServerOptions {
SiteName = "Demo Identity Server",
IssuerUri = (string)ConfigurationManager.AppSettings["options.issuerUri"],
Factory = factory,
SigningCertificate = LoadCertificate()
});
});
app.Map("/admin", adminApp => {
adminApp.UseIdentityManager(new IdentityManagerOptions() {
Factory = new IdentityManagerServiceFactory().Configure(connectionString)
});
});
}
X509Certificate2 LoadCertificate() {
//Test certificate sourced from https://github.com/IdentityServer/IdentityServer3.Samples/tree/master/source/Certificates
return new X509Certificate2(
string.Format(@"{0}\bin\{1}", AppDomain.CurrentDomain.BaseDirectory, ConfigurationManager.AppSettings["signing-certificate.name"]),
(string)ConfigurationManager.AppSettings["signing-certificate.password"]);
}
}
Настройте код расширенного метода:
public static class IdentityServerServiceFactoryExtensions {
public static IdentityServerServiceFactory Configure(this IdentityServerServiceFactory factory, string connectionString) {
var serviceOptions = new EntityFrameworkServiceOptions { ConnectionString = connectionString };
factory.RegisterOperationalServices(serviceOptions);
factory.RegisterConfigurationServices(serviceOptions);
//factory.RegisterClientStore(serviceOptions);
factory.Register(new Registration<Context>(resolver => new Context(connectionString)));
factory.Register(new Registration<UserStore>());
factory.Register(new Registration<UserManager>());
factory.UserService = new Registration<IUserService, IdentityUserService>();
return factory;
}
}
Но когда я попытался сделать то же самое для конечной точки «/admin», я не нашел никакой помощи или способа настроить это. Я спрашивал об этом в проблемах проекта github, но пока не получил никаких отзывов.
Надеюсь, это поможет