I want to integrate the concurrent login feature. I downloaded the sample code from GitHub. I have a microservice template. What is the best practice to integrate the concurrent login feature, with Auth Server or Identity service or any other way?
I have microservice architecture. I have configured the blog provider in the administration microservice. I have a multi-tenancy configuration as well. I want to use different azure connection strings based on tenant configuration. I want to give the setting for the blob storage provider and the tenant can change the setting. I also want to give choices to tenants either they can use azure storage or aws storage. So basically I want blob configuration based on the settings of the tenant.
I am trying to integrate concurrent login in the Identity service but the problem is I have version 6.0rc.5 with OpenIdDict integration and the concurrent login sample version is 6.0rc.2 with Identity server 4 integration.
I am struggling to replace the below file to convert into OpenIdDict.
using System;
using System.Threading.Tasks;
using IdentityServer4.AspNetIdentity;
using IdentityServer4.Validation;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Identity;
using Volo.Abp.IdentityServer.AspNetIdentity;
using Volo.Abp.IdentityServer.Localization;
using IdentityUser = Volo.Abp.Identity.IdentityUser;
namespace ChurchPharmacy.IdentityService.AspNetIdentity;
public class ConcurrentLoginResourceOwnerPasswordValidator : AbpResourceOwnerPasswordValidator
{
public ConcurrentLoginResourceOwnerPasswordValidator(
Microsoft.AspNetCore.Identity.UserManager<IdentityUser> userManager,
Microsoft.AspNetCore.Identity.SignInManager<IdentityUser> signInManager,
IdentitySecurityLogManager identitySecurityLogManager,
ILogger<ResourceOwnerPasswordValidator<IdentityUser>> logger,
IStringLocalizer<AbpIdentityServerResource> localizer, IOptions<AbpIdentityOptions> abpIdentityOptions,
IHybridServiceScopeFactory serviceScopeFactory, IOptions<IdentityOptions> identityOptions) : base(userManager,
signInManager, identitySecurityLogManager, logger, localizer, abpIdentityOptions, serviceScopeFactory,
identityOptions)
{
}
protected override async Task SetSuccessResultAsync(ResourceOwnerPasswordValidationContext context, IdentityUser user)
{
user.SetProperty(ConcurrentLoginConsts.ConcurrentLoginToken, Guid.NewGuid().ToString("N"));
await UserManager.UpdateAsync(user);
await base.SetSuccessResultAsync(context, user);
}
}
I have microservice architecture and I want to integrate concurrent modules as a plugin.
I have downloaded the sample concurrent login module and built the project and put the dls in a folder.
I have registered this module as a plugin in the web gateway configuration.
context.Services.AddApplication<ChurchPharmacyWebGatewayModule>(options =>
{
options.PlugInSources.AddFolder(@"D:\abp\abp6\ChurchPharmacy\plugins", System.IO.SearchOption.AllDirectories);
});
When I run the project I am getting the below error in the web gateway.
I read the documentation on background jobs and worker processes but I have a requirement to schedule the task to run on a specific date and time. I don't want to use the worker process which will run on every seconds or minutes to check the schedular and execute the task.
Suppose, I have a task to change the product price at midnight or a specific date and time so I can schedule the new product price and that job should trigger exact the date and time and change the product price.
I fixed the issue. I registered a domain resolver on the gateway level. I removed from gateway and registered in administration microservice level.
I have created my custom domain tenant resolver class. I have the below configuration in a microservice architecture. I am using the 6.0 preview version.
Angular Host Domain: abp.mydomain.com Gateway domain: abpapi.mydomain.com AuthServer domain: abpauth.mydomain.com
Tenant domain: tenant.mydomain.com The gateway and auth server are the same as above.
Configure<AbpTenantResolveOptions>(options =>
{
options.TenantResolvers.Clear();
options.TenantResolvers.Add(new TenantDomainResolver("{0}.mydomain.com"));
});
Tenant Domain Resolver
public class TenantDomainResolver: TenantResolveContributorBase
{
public const string ContributorName = "Custom";
public override string Name => ContributorName;
private static readonly string[] ProtocolPrefixes = { "http://", "https://" };
private readonly string _domainFormat;
public TenantDomainResolver(string domainFormat)
{
_domainFormat = domainFormat;
}
public override async Task ResolveAsync(ITenantResolveContext context)
{
var httpContext = context.GetHttpContext();
var referer = httpContext.Request.Headers["Referer"].ToString();
if (string.IsNullOrEmpty(referer))
{
return;
}
referer = referer.RemovePreFix(ProtocolPrefixes);
var extractResult = FormattedStringValueExtracter.Extract(referer, _domainFormat, ignoreCase: true);
if (extractResult != null && extractResult.IsMatch)
{
if (extractResult.Matches[0].Value != "abp") // if referer is not host domain
{
context.Handled = true;
context.TenantIdOrName = extractResult.Matches[0].Value;
}
}
}
It's working fine as the host domain 'abp.mydomain.com' from the angular application but when I browse by the 'tenant.mydomain.com' angular application, its calls API 'https://abpapi.mydomain.com/api/abp/multi-tenancy/tenants/by-name/tenant' and throwing an exception as below.
There is no tenant with the tenant id or name: tenant
but when I copy the endpoint URL and directly call in the browser, it's showing the tenant data.
{"success":true,"tenantId":"40cd013e-dfb4-e3e7-e205-3a0653710d75","name":"tenant","isActive":true}
These are the logs of web gateway.
2022-09-16 18:24:23.492 +05:30 [INF] Application started. Press Ctrl+C to shut down.
2022-09-16 18:24:23.492 +05:30 [INF] Hosting environment: Production
2022-09-16 18:24:23.492 +05:30 [INF] Content root path: D:\abp\abp6\publish\web
2022-09-16 18:24:23.516 +05:30 [INF] Request starting HTTP/2 OPTIONS https://abpapi.mydomain.com/api/abp/multi-tenancy/tenants/by-name/tenant - -
2022-09-16 18:24:23.530 +05:30 [INF] CORS policy execution successful.
2022-09-16 18:24:23.541 +05:30 [INF] Request starting HTTP/2 GET https://abpapi.mydomain.com/api/abp/multi-tenancy/tenants/by-name/tenant - -
2022-09-16 18:24:23.542 +05:30 [INF] CORS policy execution successful.
2022-09-16 18:24:23.547 +05:30 [INF] Request finished HTTP/2 OPTIONS https://abpapi.mydomain.com/api/abp/multi-tenancy/tenants/by-name/tenant - - - 204 - - 31.0747ms
2022-09-16 18:24:23.573 +05:30 [INF] Request finished HTTP/2 GET https://abpapi.mydomain.com/api/abp/multi-tenancy/tenants/by-name/tenant - - - 500 - text/html 31.7616ms
I noticed skipIssuerCheck: true. This will help.
I have one more issue here. Can I have different domains specific tenant configuration as the example below?
sub1.domain.com as host sub2.domain.com as tenant tenant1.com as tenant tenant2.co.uk as tenant tenant3.net as tenant
because the tenant may have their own domain instead of the sub-domain of the host domain or they may choose a subdomain as well.
Currently, I am facing the issue of login in with the tenant URL.
Getting below error when trying to login with tenant login page.
vendor.js:169503 invalid issuer in discovery document expected: https://red.api.getabp.net:44322 current: http://api.getabp.net:44322
Configure<IdentityServerOptions>(options =>
{
options.IssuerUri = configuration["App:SelfUrl"];
});
Anybody is there? Need proper documentation on multi-tenancy domain resolver on microservice architecture