Hi,
How I reproduce the problem. could you share the full steps to reproduce? I will check it. thanks.
Hi,
Because it didn't find a user!
The search code logic is the same as the AbpLdapSample example:
https://github.com/abpframework/abp-samples/blob/master/AbpLdapSample/AbpLdapSample/Program.cs#L38
You can test your LDAP configuration through AbpLdapSample.
If it still doesn't work, can you share the LDAP configuration and test users with me? shiwei.liang@volosoft.com I'll check it.
I think it returns a null value.
This is the source code:
protected async override Task<ExternalLoginUserInfo> GetUserInfoAsync(string userName)
{
var email = await LdapManager.GetUserEmailAsync(userName);
if (email.IsNullOrWhiteSpace())
{
throw new Exception("Unable to get the email of ldap user!");
}
return new ExternalLoginUserInfo(email);
}
-------------
[Dependency(ReplaceServices = true)]
[ExposeServices(typeof(OpenLdapManager), typeof(ILdapManager), typeof(LdapManager))]
public class OpenLdapManager : LdapManager
{
public OpenLdapManager(ILdapSettingProvider ldapSettingProvider)
: base(ldapSettingProvider)
{
}
public virtual async Task<string> GetUserEmailAsync(string userName)
{
using (var conn = await CreateLdapConnectionAsync())
{
await AuthenticateLdapConnectionAsync(conn, await NormalizeUserNameAsync(await LdapSettingProvider.GetUserNameAsync()), await LdapSettingProvider.GetPasswordAsync());
var searchResults = await conn.SearchAsync(await GetBaseDnAsync(), await GetUserFilterAsync(userName));
try
{
var userEntry = searchResults.First();
return await GetUserEmailAsync(userEntry);
}
catch (LdapException e)
{
Logger.LogException(e);
}
return null;
}
}
protected async override Task ConnectAsync(ILdapConnection ldapConnection)
{
ldapConnection.Connect(await LdapSettingProvider.GetServerHostAsync(), await LdapSettingProvider.GetServerPortAsync());
}
protected virtual async Task<string> NormalizeUserNameAsync(string userName)
{
return $"cn={userName},{await LdapSettingProvider.GetBaseDcAsync()}";
}
protected virtual Task<string> GetUserEmailAsync(LdapEntry ldapEntry)
{
return Task.FromResult(ldapEntry.ToDirectoryEntry().GetAttribute("mail")?.GetValue<string>());
}
protected virtual async Task<string> GetBaseDnAsync()
{
return await LdapSettingProvider.GetBaseDcAsync();
}
protected virtual Task<string> GetUserFilterAsync(string userName)
{
return Task.FromResult($"(&(uid={userName}))");
}
}
Also, could you also explain to me what was happening in the default components I need to override? In case another problem of the sort happens.
Because the component is rendered in real-time, it did not bind the initialization event. call events after rendering components through this temporary solution.
We will fix it in the next patch version, you can safely delete them in a later version(Leptonx Theme package)
Hi,
Oh I didnt see your message that says that its Blazor's design. Do you have any documentation I could read that explains it?
The Microsoft document does not explain in detail, it just briefly mentions it.
AuthenticationService handles the low-level details of the OIDC protocol. The app internally calls methods defined in the script to perform the authentication operations.
https://learn.microsoft.com/en-us/aspnet/core/blazor/security/webassembly/standalone-with-authentication-library?view=aspnetcore-7.0&tabs=visual-studio#index-page
Check the source code and you will find that it will try to process the callback every time the application starts. https://github.com/dotnet/aspnetcore/blob/release/7.0/src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/AuthenticationService.ts#L520
Hi,
You can check the document: https://docs.abp.io/en/commercial/latest/modules/identity/ldap#customize-built-in-services
I will check it
Hi,
I'll see if I can deploy an empty/newly templated base ABP app to Azure in order to replicate, which should eliminate the possibility that any of our logic/overrides are contributing to the issue.
Can the problem be reproduced in the new template?