hi
Can you share the response of https://localhost:44368/Abp/ApplicationConfigurationScript?
Or you can share a test project that can reproduce the problem.
Thanks.
hi
Main point, how can I register someone automatically based on the claims received from an external provider? Previously I just overrode CreateExternalUserAsync on LoginModel.
You can override the Task<IActionResult> OnGetAsync() method
if IsExternalLogin is true, then get user info by
var externalLoginInfo = await SignInManager.GetExternalLoginInfoAsync();
Do your register logic in the OnGetAsync by copy code from OnPostAsync method.
hi
Please share the logs.txt of your backend app.
You can share it via https://wetransfer.com/
Thanks.
liming.ma@volosoft.com
hi
Please check the logs from the browser console and the app's logs.
hi
Have you configured your app to Forwarded headers?
https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-8.0#fhmo
validationParameters.ValidIssuer will be set as request.Scheme + Uri.SchemeDelimiter + host + request.PathBase
You can add a middleware to output the HTTP request info to logs to see the request host.
hi
if I can have any way to manage the organize data in azure?
This is not the initial design of the FM module.
If I want to upload a file from coding, do we have any accessible method of file management module to create folder in file management module? So I can have track of all the documents uploaded from code in file management module.
You can inject the Domain or AppService services to upload and manage the file/folder.
https://docs.abp.io/en/commercial/latest/modules/file-management#domain-services https://docs.abp.io/en/commercial/latest/modules/file-management#application-services
hi
What's the value of ReturnUrl?
And does your URL exist in RedirectAllowedUrls?
{
"App": {
"RedirectAllowedUrls": "http://localhost:4200,https://localhost:44307"
}
}
hi
Yes, You have to enable the Redis.
https://support.abp.io/QA/Questions/6533/Why-do-I-need-the-Redis-cache-for-the-public-website#answer-3a10363f-48d7-73fe-88fc-51114ebe105d
hi
I confirmed. You have to use Redis in tiered projects. otherwise, you may get some strange problems.
but you can try the code below:
host/TestApplicationNet8.Web.Host/MyMvcRemoteTenantStore.cs
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Options;
using Pages.Abp.MultiTenancy.ClientProxies;
using Volo.Abp.AspNetCore.Mvc.Client;
using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Threading;
namespace TestApplicationNet8;
[ExposeServices(typeof(ITenantStore))]
public class MyMvcRemoteTenantStore : ITenantStore, ITransientDependency
{
protected AbpTenantClientProxy TenantAppService { get; }
protected IHttpContextAccessor HttpContextAccessor { get; }
protected IDistributedCache<TenantConfigurationCacheItem> Cache { get; }
protected AbpAspNetCoreMvcClientCacheOptions Options { get; }
public MyMvcRemoteTenantStore(
AbpTenantClientProxy tenantAppService,
IHttpContextAccessor httpContextAccessor,
IDistributedCache<TenantConfigurationCacheItem> cache,
IOptions<AbpAspNetCoreMvcClientCacheOptions> options)
{
TenantAppService = tenantAppService;
HttpContextAccessor = httpContextAccessor;
Cache = cache;
Options = options.Value;
}
public async Task<TenantConfiguration?> FindAsync(string normalizedName)
{
var cacheKey = TenantConfigurationCacheItem.CalculateCacheKey(normalizedName);
var httpContext = HttpContextAccessor?.HttpContext;
if (httpContext != null && httpContext.Items[cacheKey] is TenantConfigurationCacheItem tenantConfigurationInHttpContext)
{
return tenantConfigurationInHttpContext?.Value;
}
var tenantConfiguration = await Cache.GetAsync(cacheKey);
if (tenantConfiguration?.Value == null)
{
var tenant = await TenantAppService.FindTenantByNameAsync(normalizedName);
if (tenant.Success)
{
tenantConfiguration = new TenantConfigurationCacheItem(new TenantConfiguration(tenant.TenantId!.Value, tenant.NormalizedName!));
await Cache.SetAsync(cacheKey, tenantConfiguration);
}
}
if (httpContext != null)
{
httpContext.Items[cacheKey] = tenantConfiguration;
}
return tenantConfiguration?.Value;
}
public async Task<TenantConfiguration?> FindAsync(Guid id)
{
var cacheKey = TenantConfigurationCacheItem.CalculateCacheKey(id);
var httpContext = HttpContextAccessor?.HttpContext;
if (httpContext != null && httpContext.Items[cacheKey] is TenantConfigurationCacheItem tenantConfigurationInHttpContext)
{
return tenantConfigurationInHttpContext?.Value;
}
var tenantConfiguration = await Cache.GetAsync(cacheKey);
if (tenantConfiguration?.Value == null)
{
var tenant = await TenantAppService.FindTenantByIdAsync(id);
if (tenant.Success)
{
tenantConfiguration = new TenantConfigurationCacheItem(new TenantConfiguration(tenant.TenantId!.Value, tenant.NormalizedName!));
await Cache.SetAsync(cacheKey, tenantConfiguration);
}
}
if (httpContext != null)
{
httpContext.Items[cacheKey] = tenantConfiguration;
}
return tenantConfiguration?.Value;
}
public Task<IReadOnlyList<TenantConfiguration>> GetListAsync(bool includeDetails = false)
{
return Task.FromResult<IReadOnlyList<TenantConfiguration>>(Array.Empty<TenantConfiguration>());
}
public TenantConfiguration? Find(string normalizedName)
{
var cacheKey = TenantConfigurationCacheItem.CalculateCacheKey(normalizedName);
var httpContext = HttpContextAccessor?.HttpContext;
if (httpContext != null && httpContext.Items[cacheKey] is TenantConfigurationCacheItem tenantConfigurationInHttpContext)
{
return tenantConfigurationInHttpContext?.Value;
}
var tenantConfiguration = Cache.Get(cacheKey);
if (tenantConfiguration?.Value == null)
{
var tenant = AsyncHelper.RunSync(async () => await TenantAppService.FindTenantByNameAsync(normalizedName));
if (tenant.Success)
{
tenantConfiguration = new TenantConfigurationCacheItem(new TenantConfiguration(tenant.TenantId!.Value, tenant.NormalizedName!));
Cache.Set(cacheKey, tenantConfiguration);
}
}
if (httpContext != null)
{
httpContext.Items[cacheKey] = tenantConfiguration;
}
return tenantConfiguration?.Value;
}
public TenantConfiguration? Find(Guid id)
{
var cacheKey = TenantConfigurationCacheItem.CalculateCacheKey(id);
var httpContext = HttpContextAccessor?.HttpContext;
if (httpContext != null && httpContext.Items[cacheKey] is TenantConfigurationCacheItem tenantConfigurationInHttpContext)
{
return tenantConfigurationInHttpContext?.Value;
}
var tenantConfiguration = Cache.Get(cacheKey);
if (tenantConfiguration?.Value == null)
{
var tenant = AsyncHelper.RunSync(async () => await TenantAppService.FindTenantByIdAsync(id));
if (tenant.Success)
{
tenantConfiguration = new TenantConfigurationCacheItem(new TenantConfiguration(tenant.TenantId!.Value, tenant.NormalizedName!));
Cache.Set(cacheKey, tenantConfiguration);
}
}
if (httpContext != null)
{
httpContext.Items[cacheKey] = tenantConfiguration;
}
return tenantConfiguration?.Value;
}
}
Yes. Azure is used store file. The FM module is used to store file/folder info.