Thank you! With the additional information, the page works as expected.
Following those instructions does not address the issues. Take a look at the screenshot of what I see after following the provided instructions.
None of these items are in the login page. I am guessing they are in the layout page.
Following the instructions does not yield the desired result.
The provided documentation shows me how to change the login page but it does not match what exists for the login page of ABP Commercial projects. Would it be possible to get the code which matches the commercial version?
Note: I did not purchase the license with source code rights. However, it is a reasonable expectation that every commercial customer will want to modify the branding information (page title and logo) on the login page. If we are expected to override components to change this information, we should be provided the source code for that component regardless of our license.
Could you provide instructions on how to customize (page title / logo) the login page when using Authorization Code Flow for the Angular UI. I have looked through all the documenation and support cases which seem relevant, but I have not found how to change the MVC UI component which is getting called in this scenario. I am not using the tiered solution, so I do not have a separate project for the identity server.
From release notes Authorization Code Flow With this change, the Angular application now redirects to the login page of the MVC UI which was implemented using the Identity Server 4.
References of what I have tried which did not work https://docs.abp.io/en/abp/latest/UI/Angular/Component-Replacement#how-to-replace-a-component https://support.abp.io/QA/Questions/306/Custom-Login-Page-For-Angular https://gist.github.com/ebicoglu/ce0f0425bab806d0ee1a87d0073af96b - this looked promising, but I do not have a separate IdentityServer project
I have customized the tenant property of the saas module, adding several properties.
In ZiplineModuleExtensionConfigurator, I added the following:
tenant.AddOrUpdateProperty<ServerType>(
"ServerType",
property =>
{
property.Attributes.Add(new RequiredAttribute());
property.DisplayName = LocalizableString.Create<ZiplineResource>("ServerType");
});
In ZiplineEfCoreEntityExtensionMappings, I added the following:
ObjectExtensionManager.Instance.MapEfCoreProperty<Tenant, ServerType>("ServerType");
The drop down list shows up correctly. However, when I attempt to save the tenant (either on New or Edit), I get an invalid cast exception.
The stack trace is provided below:
2020-09-21 18:06:06.905 -04:00 [ERR] Invalid cast from 'System.Int64' to 'OtisEd.Zipline.Environments.EnvironmentType'.
System.InvalidCastException: Invalid cast from 'System.Int64' to 'OtisEd.Zipline.Environments.EnvironmentType'.
at System.Convert.DefaultToType(IConvertible value, Type targetType, IFormatProvider provider)
at System.Int64.System.IConvertible.ToType(Type type, IFormatProvider provider)
at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
at Volo.Abp.EntityFrameworkCore.AbpDbContext1.HandleExtraPropertiesOnSave(EntityEntry entry) at Volo.Abp.EntityFrameworkCore.AbpDbContext
1.ApplyAbpConcepts(EntityEntry entry, EntityChangeReport changeReport)
at Volo.Abp.EntityFrameworkCore.AbpDbContext1.ApplyAbpConcepts() at Volo.Abp.EntityFrameworkCore.AbpDbContext
1.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
at Volo.Abp.Uow.UnitOfWork.SaveChangesAsync(CancellationToken cancellationToken)
at Volo.Saas.Host.TenantAppService.CreateAsync(SaasTenantCreateDto input)
at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo)
at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue1.ProceedAsync() at Volo.Abp.Authorization.AuthorizationInterceptor.InterceptAsync(IAbpMethodInvocation invocation) at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter
1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func3 proceed) at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo) at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue
1.ProceedAsync()
at Volo.Abp.Auditing.AuditingInterceptor.InterceptAsync(IAbpMethodInvocation invocation)
at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func
3 proceed)
at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo)
at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue1.ProceedAsync() at Volo.Abp.Validation.ValidationInterceptor.InterceptAsync(IAbpMethodInvocation invocation) at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter
1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func3 proceed) at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo) at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue
1.ProceedAsync()
at Volo.Abp.Uow.UnitOfWorkInterceptor.InterceptAsync(IAbpMethodInvocation invocation)
at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func
3 proceed)
at lambda_method(Closure , Object )
at Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult()
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.