Open Closed

Angular multitenancy #1853


User avatar
0
can.ercan created
  • ABP Framework version: v4.2.2
  • UI type: Angular
  • DB provider: EF Core
  • Tiered (MVC) or Identity Server Separated (Angular): no
  • Exception message and stack trace:
  • Steps to reproduce the issue:"

I am trying to implement multitenancy. My app.settings and angular environment variables are like below

{ "App": { "SelfUrl": "https://pbxticketapi.azurewebsites.net", "AngularUrl": "https://merlinvoip.com", "CorsOrigins": "https://merlinvoip.com,https://.merlinvoip.com,https://dva.merlinvoip.com,https://pbxticketclient.azurewebsites.net", "RedirectAllowedUrls": "https://merlinvoip.com,https://.merlinvoip.com,https://dva.merlinvoip.com,https://pbxticketclient.azurewebsites.net" }, "Redis": { "Configuration": "127.0.0.1" }, "ConnectionStrings": { "Default": ";" }, "AuthServer": { "Authority": "https://pbxticketapi.azurewebsites.net", "RequireHttpsMetadata": "false", "SwaggerClientId": "TestApp2_Swagger", "SwaggerClientSecret": "1q2w3e*" }, "StringEncryption": { "DefaultPassPhrase": "rL1OCmPHd9IOQZ7w" }, "Settings": { "Volo.Abp.LeptonTheme.Style": "Style6", "Volo.Abp.LeptonTheme.Layout.MenuPlacement": "Left", "Volo.Abp.LeptonTheme.Layout.MenuStatus": "AlwaysOpened", "Volo.Abp.LeptonTheme.Layout.Boxed": "False" } }

import { Environment } from '@abp/ng.core';

const baseUrl = 'https://{0}.merlinvoip.com';

export const environment = { production: true, application: { baseUrl, name: 'TestApp2', }, oAuthConfig: { issuer: 'https://pbxticketapi.azurewebsites.net', redirectUri: baseUrl, clientId: 'TestApp2_App', responseType: 'code', scope: 'offline_access TestApp2', requireHttps: false }, apis: { default: { url: 'https://pbxticketapi.azurewebsites.net', rootNamespace: 'TestApp2', }, }, } as Environment;

I put the code

Configure<AbpTenantResolveOptions>(options => { options.AddDomainTenantResolver("{0}.merlinvoip.com"); }); to HttpApiHostModule/ConfigureServices

When i try to login with a subdomain like https://dva.merlinvoip.com when cliecked to login i get 500 error code. When i looked at the logs i found error:

Invalid client configuration for client TestApp2_App: AllowedCorsOrigins contains invalid origin: https://*.merlinvoip.com

I tried changing the IdentityServerClientCorsOrigins table value to https://{0}.merlinvoip.com it didn't work either. Only way i can make it work is changing the value to https://merlinvoip.com and login as host admin but then i can't resolve tenant with subdomain that way. And i can't login with subdomain because i get redirect uri error when i click login that way.

I must be able to user both https://merlinvoip.com as an host admin and https://dva.merlinvoip.com as a tenant. I have a tenant created in the database as dva.

How should i set the values to IdentityServerClientCorsOrigins and IdentityServerClientRedirectUris tables in the database?

Thanks, Can Ercan


11 Answer(s)
  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    hi

    https://github.com/abpframework/abp-samples/tree/master/DomainTenantResolver https://github.com/abpframework/abp-samples/blob/master/DomainTenantResolver/NG/aspnet-core/src/BookStore.HttpApi.Host/BookStoreHttpApiHostModule.cs#L58-L64

  • User Avatar
    0
    can.ercan created

    Hi,

    I updated the HttpApiHostModule according to the sample app link you provided like below:

        context.Services.AddAbpStrictRedirectUriValidator();
        context.Services.AddAbpClientConfigurationValidator();
        context.Services.AddAbpWildcardSubdomainCorsPolicyService();
        Configure<AbpTenantResolveOptions>(options =>
        {       
            options.AddDomainTenantResolver("{0}.api.merlinvoip.com");
        });
    

    My appsettings.json file:

    {
    "App": {
      "SelfUrl": "https://api.merlinvoip.com",
      "CorsOrigins": "https://merlinvoip.com,https://*.merlinvoip.com"
    },
    "Redis": {
      "Configuration": "127.0.0.1"
    },
    "ConnectionStrings": {
      "Default": ""
    },
    "AuthServer": {
      "Authority": "https://api.merlinvoip.com",
      "RequireHttpsMetadata": "false",
      "SwaggerClientId": "TestApp2_Swagger",
      "SwaggerClientSecret": "1q2w3e*"
    },
    "StringEncryption": {
      "DefaultPassPhrase": "rL1OCmPHd9IOQZ7w"
    },
    "Settings": {
      "Volo.Abp.LeptonTheme.Style": "Style6",
      "Volo.Abp.LeptonTheme.Layout.MenuPlacement": "Left",
      "Volo.Abp.LeptonTheme.Layout.MenuStatus": "AlwaysOpened",
      "Volo.Abp.LeptonTheme.Layout.Boxed": "False"
    }
    }
    
    **DbMigrator appsettings.json:**
    {
    "ConnectionStrings": {
      "Default": ""
    },
    "IdentityServer": {
      "Clients": {
        "TestApp2_App": {
          "ClientId": "TestApp2_App",
          "ClientSecret": "1q2w3e*",
          "RootUrl": "https://{0}.merlinvoip.com"
        },
      
        "TestApp2_Swagger": {
          "ClientId": "TestApp2_Swagger",
          "RootUrl": "https://api.merlinvoip.com"
        }
      }
    }
    }
    **My angular client environment variables:** 
    
    const baseUrl = 'https://{0}.merlinvoip.com';
    export const environment = {
    production: true,
    application: {
      baseUrl,
      name: 'TestApp2',
    },
    oAuthConfig: {
      issuer: 'https://api.merlinvoip.com',
      redirectUri: baseUrl,
      clientId: 'TestApp2_App',
      responseType: 'code',
      scope: 'offline_access TestApp2',
      requireHttps: true
    },
    apis: {
      default: {
        url: 'https://api.merlinvoip.com',
        rootNamespace: 'TestApp2',
      },
    },
    } as Environment;
    

    In the database:

    IdentityServerClientCorsOrigins table:
    33764f2e-a4b3-ba64-06d1-39fef527bc9e	https://{0}.merlinvoip.com
    2f3968f2-6d8f-70fc-b233-39fef527bd61	   https://api.merlinvoip.com
    IdentityServerClientRedirectUris table:
    33764f2e-a4b3-ba64-06d1-39fef527bc9e	https://{0}.merlinvoip.com
    2f3968f2-6d8f-70fc-b233-39fef527bd61	   https://api.merlinvoip.com
    

    When i go to the url https://merlinvoip.com and click login i get 500 server error.

    The log shows :

    2021-09-20 11:02:05.450 +00:00 [INF] Request starting HTTP/1.1 GET https://api.merlinvoip.com/Account/Login?ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fresponse_type%3Dcode%26client_id%3DTestApp2_App%26state%3DV3AtQVRXLlFhYUtfLkdfdzFiRVQ2dzFqS3BKblpUMlV-TFNFc1p2d3YwTVcz%26redirect_uri%3Dhttps%253A%252F%252Fmerlinvoip.com%26scope%3Dopenid%2520offline_access%2520TestApp2%26code_challenge%3DzbaeuulWht0iscH43qvlt3Y0VRgkLQlcOwbnOH2wW9o%26code_challenge_method%3DS256%26nonce%3DV3AtQVRXLlFhYUtfLkdfdzFiRVQ2dzFqS3BKblpUMlV-TFNFc1p2d3YwTVcz%26culture%3Dtr%26ui-culture%3Dtr - -
    2021-09-20 11:02:05.615 +00:00 [INF] Executing endpoint '/Account/Login'
    2021-09-20 11:02:05.616 +00:00 [INF] Route matched with {page = "/Account/Login", action = "", controller = "", area = ""}. Executing page /Account/Login
    2021-09-20 11:02:05.616 +00:00 [INF] Skipping the execution of current filter as its not the most effective filter implementing the policy Microsoft.AspNetCore.Mvc.ViewFeatures.IAntiforgeryPolicy
    2021-09-20 11:02:05.627 +00:00 [INF] Executed page /Account/Login in 10.8974ms
    2021-09-20 11:02:05.627 +00:00 [INF] Executed endpoint '/Account/Login'
    2021-09-20 11:02:05.718 +00:00 [ERR] An unhandled exception has occurred while executing the request.
    Autofac.Core.DependencyResolutionException: An exception was thrown while activating Volo.Abp.Account.Web.Pages.Account.IdentityServerSupportedLoginModel -> Volo.Abp.Account.AccountAppService -> Volo.Abp.Account.Emailing.AccountEmailer -> Volo.Abp.UI.Navigation.Urls.AppUrlProvider.
     ---> Autofac.Core.DependencyResolutionException: An exception was thrown while invoking the constructor 'Void .ctor(Microsoft.Extensions.Options.IOptions`1[Volo.Abp.UI.Navigation.Urls.AppUrlOptions], Volo.Abp.MultiTenancy.ICurrentTenant, Volo.Abp.MultiTenancy.ITenantStore)' on type 'AppUrlProvider'.
     ---> System.NullReferenceException: Object reference not set to an instance of an object.
       at TestApp2.TestApp2HttpApiHostModule.&lt;&gt;c__DisplayClass2_0.&lt;ConfigureUrls&gt;b__0(AppUrlOptions options) in E:\abp\TestApp2\aspnet-core\src\TestApp2.HttpApi.Host\TestApp2HttpApiHostModule.cs:line 103
       at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options)
       at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name)
       at Microsoft.Extensions.Options.OptionsManager`1.<>c__DisplayClass5_0.<Get>b__0()
       at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
    --- End of stack trace from previous location ---
       at System.Lazy`1.CreateValue()
       at Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions)
       at Microsoft.Extensions.Options.OptionsManager`1.Get(String name)
       at Microsoft.Extensions.Options.OptionsManager`1.get_Value()
       at lambda_method945(Closure , Object[] )
       at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate()
       --- End of inner exception stack trace ---
       at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate()
       at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
       at Autofac.Core.Activators.Reflection.ReflectionActivator.&lt;ConfigurePipeline&gt;b__11_0(ResolveRequestContext ctxt, Action`1 next)
       at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next)
       at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.&lt;&gt;c__DisplayClass14_0.&lt;BuildPipeline&gt;b__1(ResolveRequestContext ctxt)
       at Autofac.Core.Resolving.Middleware.DisposalTrackingMiddleware.Execute(ResolveRequestContext context, Action`1 next)
       at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext ctxt)
       at Autofac.Builder.RegistrationBuilder`3.&lt;&gt;c__DisplayClass41_0.&lt;PropertiesAutowired&gt;b__0(ResolveRequestContext ctxt, Action`1 next)
       at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next)
       at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.&lt;&gt;c__DisplayClass14_0.&lt;BuildPipeline&gt;b__1(ResolveRequestContext ctxt)
       at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next)
       --- End of inner exception stack trace ---
       at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next)
       at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.&lt;&gt;c__DisplayClass14_0.&lt;BuildPipeline&gt;b__1(ResolveRequestContext ctxt)
       at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt)
       at Autofac.Core.Resolving.Middleware.RegistrationPipelineInvokeMiddleware.Execute(ResolveRequestContext context, Action`1 next)
       at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext ctxt)
       at Autofac.Core.Resolving.Middleware.SharingMiddleware.Execute(ResolveRequestContext context, Action`1 next)
       at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.&lt;&gt;c__DisplayClass14_0.&lt;BuildPipeline&gt;b__1(ResolveRequestContext ctxt)
       at Autofac.Core.Resolving.Middleware.ScopeSelectionMiddleware.Execute(ResolveRequestContext context, Action`1 next)
       at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext ctxt)
       at Autofac.Core.Resolving.Middleware.CircularDependencyDetectorMiddleware.Execute(ResolveRequestContext context, Action`1 next)
       at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.&lt;&gt;c__DisplayClass14_0.&lt;BuildPipeline&gt;b__1(ResolveRequestContext ctxt)
       at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt)
       at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest request)
       at Autofac.Core.Resolving.ResolveOperation.ExecuteOperation(ResolveRequest request)
       at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest request)
       at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)
       at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters)
       at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetRequiredService(Type serviceType)
       at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
       at Volo.Abp.AspNetCore.Mvc.UI.RazorPages.ServiceBasedPageModelActivatorProvider.&lt;&gt;c__DisplayClass0_0.&lt;CreateActivator&gt;b__0(PageContext context)
       at Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.DefaultPageModelFactoryProvider.&lt;&gt;c__DisplayClass3_0.&lt;CreateModelFactory&gt;b__0(PageContext pageContext)
       at Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.CreateInstance()
       at Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
       at Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.InvokeInnerFilterAsync()
       at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.&lt;InvokeNextExceptionFilterAsync&gt;g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ExceptionContextSealed context)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeNextResourceFilter()
    --- End of stack trace from previous location ---
       at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
    --- End of stack trace from previous location ---
       at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.&lt;InvokeAsync&gt;g__Logged|17_1(ResourceInvoker invoker)
       at Microsoft.AspNetCore.Routing.EndpointMiddleware.&lt;Invoke&gt;g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
       at Volo.Abp.AspNetCore.Serilog.AbpSerilogMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
       at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.&lt;&gt;c__DisplayClass6_1.&lt;&lt;UseMiddlewareInterface&gt;b__1>d.MoveNext()
    --- End of stack trace from previous location ---
       at Volo.Abp.AspNetCore.Auditing.AbpAuditingMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
       at Volo.Abp.AspNetCore.Auditing.AbpAuditingMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
       at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.&lt;&gt;c__DisplayClass6_1.&lt;&lt;UseMiddlewareInterface&gt;b__1>d.MoveNext()
    --- End of stack trace from previous location ---
       at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
       at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
       at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
       at IdentityServer4.Hosting.IdentityServerMiddleware.Invoke(HttpContext context, IEndpointRouter router, IUserSession session, IEventService events, IBackChannelLogoutService backChannelLogoutService)
       at IdentityServer4.Hosting.MutualTlsEndpointMiddleware.Invoke(HttpContext context, IAuthenticationSchemeProvider schemes)
       at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
       at IdentityServer4.Hosting.BaseUrlMiddleware.Invoke(HttpContext context)
       at Volo.Abp.AspNetCore.Uow.AbpUnitOfWorkMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
       at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.&lt;&gt;c__DisplayClass6_1.&lt;&lt;UseMiddlewareInterface&gt;b__1>d.MoveNext()
    --- End of stack trace from previous location ---
       at Volo.Abp.AspNetCore.ExceptionHandling.AbpExceptionHandlingMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
       at Volo.Abp.AspNetCore.ExceptionHandling.AbpExceptionHandlingMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
       at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.&lt;&gt;c__DisplayClass6_1.&lt;&lt;UseMiddlewareInterface&gt;b__1>d.MoveNext()
    --- End of stack trace from previous location ---
       at Volo.Abp.AspNetCore.MultiTenancy.MultiTenancyMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
       at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.&lt;&gt;c__DisplayClass6_1.&lt;&lt;UseMiddlewareInterface&gt;b__1>d.MoveNext()
    --- End of stack trace from previous location ---
       at Microsoft.AspNetCore.Builder.ApplicationBuilderAbpJwtTokenMiddlewareExtension.&lt;&gt;c__DisplayClass0_0.&lt;&lt;UseJwtTokenMiddleware&gt;b__0>d.MoveNext()
    --- End of stack trace from previous location ---
       at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
       at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.&lt;Invoke&gt;g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)
    

    We tried countless variations of this setup to make it work but failed.

    Thanks, Can Ercan

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    hi

    Can you check the ConfigureUrls method??

    System.NullReferenceException: Object reference not set to an instance of an object.
    at TestApp2.TestApp2HttpApiHostModule.<>c__DisplayClass2_0.<ConfigureUrls>b__0(AppUrlOptions options)
    in E:\abp\TestApp2\aspnet-core\src\TestApp2.HttpApi.Host\TestApp2HttpApiHostModule.cs:line 103
    
  • User Avatar
    0
    can.ercan created

    Configure<AppUrlOptions>(options => { options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; options.Applications["Angular"].RootUrl = configuration["App:AngularUrl"]; options.Applications["Angular"].Urls[AccountUrlNames.PasswordReset] = "account/reset-password"; options.Applications["Angular"].Urls[AccountUrlNames.EmailConfirmation] = "account/email-confirmation"; );

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    It seems there is not App:AngularUrl

    "App": {
      "SelfUrl": "https://api.merlinvoip.com",
      "CorsOrigins": "https://merlinvoip.com,https://*.merlinvoip.com"
    },
    
  • User Avatar
    0
    can.ercan created

    Hmm ok, I couldn't find it in the sample project so i removed it. Sample project code:

    "App": {
        "SelfUrl": "https://api.getabp.net:44301",
        "CorsOrigins": "https://*.ng.getabp.net:4200,https://ng.getabp.net:4200/"
      }
    
    Configure<AppUrlOptions>(options =>
    {
       options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"];
       options.Applications["Angular"].RootUrl = configuration["App:ClientUrl"];
       options.Applications["Angular"].Urls[AccountUrlNames.PasswordReset] = "account/reset-password";
       });
    

    Should i put https://merlinvoip.com or https://*.merlinvoip.com

    I remember trying with https://*.merlinvoip.com and getting invalid uri error from IdentityServer.

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    You can try to use https://{{tenantName}}.merlinvoip.com

    "App": {
        "SelfUrl": "https://api.getabp.net:44301",
        "AngularUrl": "https://{{tenantName}}.merlinvoip.com",
        "CorsOrigins": "https://*.ng.getabp.net:4200,https://ng.getabp.net:4200/"
    }
    
  • User Avatar
    0
    can.ercan created

    Hi,

    When i tried to login from https://merlinvoip.com i didn't get the previous error but when i logged in and then redirected to client app i didn't appear to be logged in and the log shows:

    2021-09-21 13:01:15.892 +00:00 [INF] Invoking IdentityServer endpoint: IdentityServer4.Endpoints.TokenEndpoint for /connect/token
    2021-09-21 13:01:15.920 +00:00 [INF] {"ClientId":"TestApp2_App","AuthenticationMethod":"NoSecret","Category":"Authentication","Name":"Client Authentication Success","EventType":"Success","Id":1010,"Message":null,"ActivityId":"800001a7-0000-cb00-b63f-84710c7967bb","TimeStamp":"2021-09-21T13:01:15.0000000Z","ProcessId":6384,"LocalIpAddress":"10.11.0.130:443","RemoteIpAddress":"88.243.86.198","$type":"ClientAuthenticationSuccessEvent"}
    2021-09-21 13:01:15.995 +00:00 [INF] Token request validation success, {"ClientId":"TestApp2_App","ClientName":"TestApp2_App","GrantType":"authorization_code","Scopes":null,"AuthorizationCode":"****82BB","RefreshToken":"********","UserName":null,"AuthenticationContextReferenceClasses":null,"Tenant":null,"IdP":null,"Raw":{"grant_type":"authorization_code","code":"9A7EC69860CCE8494775D54C5FC01816A1480304478A2AEE49CE7BE5037382BB","redirect_uri":"https://merlinvoip.com","code_verifier":"N3RuWU5BWHFfN2dDfkpuazVaQko4ZnNrMGpzdmJ6UFBtVVRVcnphSWl0MU1j","client_id":"TestApp2_App"},"$type":"TokenRequestValidationLog"}
    2021-09-21 13:01:16.152 +00:00 [INF] {"ClientId":"TestApp2_App","ClientName":"TestApp2_App","RedirectUri":null,"Endpoint":"Token","SubjectId":"04a49bf7-0341-52cf-f8c8-39fef527ad38","Scopes":"openid offline_access TestApp2","GrantType":"authorization_code","Tokens":[{"TokenType":"id_token","TokenValue":"****YXBg","$type":"Token"},{"TokenType":"refresh_token","TokenValue":"****DF50","$type":"Token"},{"TokenType":"access_token","TokenValue":"****803Q","$type":"Token"}],"Category":"Token","Name":"Token Issued Success","EventType":"Success","Id":2000,"Message":null,"ActivityId":"800001a7-0000-cb00-b63f-84710c7967bb","TimeStamp":"2021-09-21T13:01:16.0000000Z","ProcessId":6384,"LocalIpAddress":"10.11.0.130:443","RemoteIpAddress":"88.243.86.198","$type":"TokenIssuedSuccessEvent"}
    2021-09-21 13:01:16.205 +00:00 [INF] Request finished HTTP/1.1 POST https://pbxticketapi.azurewebsites.net/connect/token application/x-www-form-urlencoded 233 - 200 - application/json;+charset=UTF-8 386.8135ms
    2021-09-21 13:01:16.283 +00:00 [INF] Request starting HTTP/1.1 OPTIONS https://pbxticketapi.azurewebsites.net/api/abp/application-configuration - -
    2021-09-21 13:01:16.283 +00:00 [INF] CORS policy execution successful.
    2021-09-21 13:01:16.283 +00:00 [INF] Request finished HTTP/1.1 OPTIONS https://pbxticketapi.azurewebsites.net/api/abp/application-configuration - - - 204 - - 0.5517ms
    2021-09-21 13:01:16.363 +00:00 [INF] Request starting HTTP/1.1 GET https://pbxticketapi.azurewebsites.net/api/abp/application-configuration - -
    2021-09-21 13:01:16.363 +00:00 [INF] CORS policy execution successful.
    2021-09-21 13:01:16.402 +00:00 [INF] Failed to validate the token.
    Microsoft.IdentityModel.Tokens.SecurityTokenInvalidIssuerException: IDX10205: Issuer validation failed. Issuer: 'System.String'. Did not match: validationParameters.ValidIssuer: 'System.String' or validationParameters.ValidIssuers: 'System.String'.
       at Microsoft.IdentityModel.Tokens.Validators.ValidateIssuer(String issuer, SecurityToken securityToken, TokenValidationParameters validationParameters)
       at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateIssuer(String issuer, JwtSecurityToken jwtToken, TokenValidationParameters validationParameters)
       at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateTokenPayload(JwtSecurityToken jwtToken, TokenValidationParameters validationParameters)
       at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken& validatedToken)
       at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
    

    One thing I noticed is identity server uses the https://pbxticketapi.azurewebsites.net url.I used to use this url but i changed it.

    "App": {
      "SelfUrl": "https://api.merlinvoip.com",
      "AngularUrl": "https://{{tenantName}}.merlinvoip.com",
      "CorsOrigins": "https://merlinvoip.com,https://*.merlinvoip.com"    
    }
    "AuthServer": {
      "Authority": "https://api.merlinvoip.com",
      "RequireHttpsMetadata": "false",
      "SwaggerClientId": "TestApp2_Swagger",
      "SwaggerClientSecret": "1q2w3e*"
    },
    
    Angular environment variables:
    oAuthConfig: {
      issuer: 'http://{0}.api.merlinvoip.com',
      redirectUri: baseUrl,
      clientId: 'TestApp2_App',
      responseType: 'code',
      scope: 'offline_access TestApp2',
      requireHttps: false
    },
    apis: {
      default: {
        url: 'http://{0}.api.merlinvoip.com',
        rootNamespace: 'TestApp2',
      },
    },
    

    These are my settings but system still uses the old url for identity server. I cleared cookies and caches and restarted both apps but still the old url is used. Is it in the database somewhere?

    Thanks, Can Ercan

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    hi

    https://github.com/abpframework/abp/pull/8884 https://github.com/maliming/Owl.TokenWildcardIssuerValidator

  • User Avatar
    0
    can.ercan created

    Hi Problem is solved.

    Thanks, Can Ercan

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    Good news!

Boost Your Development
ABP Live Training
Packages
See Trainings
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v10.0.0-preview. Updated on July 14, 2025, 11:57