We are facing an issue in the permissions module of the application. Actually when we add or remove any permission(s) from the AbpPermissionGrants table, by manually updating the table from the database. It takes too much time to reflect on the UI of the application. I am aware that it's getting derived via a caching mechanism but, can I know what should I do in order to make the changes instantly reflected on the UI after updating the permissions manually from the database.
Reference ticket : https://abp.io/support/questions/7882/Override-the-existing-Users-Roles--Permissions-Methodology
Consider the above ticket for reference.
After the user successfully logs into the angular application, on the top right corner area, we should have a section where there is a profile picture of the user displayed and under which the username of the user is displayed. And when clicked on profile picture, a small box section is displayed to execute user related actions.
Example :
But instead of this, we are getting the right arrow icon, clicking on which it will be redirected to the Auth Server. Just like how when it's there when the user is logged out.
Hello Team,
We have a microservices based architecture solution for our project. We don't want to use the TenantId in the AbpUsers and AbpRoles tables as per our requirements. For that what we have done is, we have kept separate tables (UserTenantAssociation and RoleTenantAssociation), using these tables we will determine which user belongs to which Tenant. And for the Roles, we will have all the Roles in the AbpRoles table with all records having TenantId as NULL, which implies the Roles will be created only in the Host Tenant and not any other Tenant. The other Tenants will be using the same Roles as Host, and which Tenants have which specific Roles to use in their tenant, that will be determined using our custom RoleTenantAssociation table where RoleId (the Id of the role from the host tenant) and the TenantId of that Tenant will be stored).
Now, displaying the list of Roles and Users on the UI doesn't seem to be a problem as we have already done necessary changes in the Users and Roles repositories in the IdentityService to achiever this feat. But the problem arises when the User logs into the Tenants.
Let's say I have a User which belongs to a Tenant, and the User has a role assigned to it as "admin", now in the AbpUserRoles table, the UserId will be the Id of the User from AbpUsers table, TenantId will be TenantId of the Tenant in which the user is trying to log into and the RoleId will be the Id of the Role "admin" from AbpRoles table but it will have TenantId as NULL as the Role belongs to the Host and the same Role should be used by all the Tenants.
Now if we run the application and when the user logs into a Tenant, it doesn't have any Roles assigned to it in the CurrentUser class, and also the GrantedPolicies will also be empty since there are no roles assigned to the user in the currentUser section of application configuration api call.
I tried to check how the values are assigned to the CurrentUser, and I came to know that it gets the values from the Claims generated during the Authentication and are passed to JWT Token during the authentication.
https://github.com/abpframework/abp/blob/8e20aab617205936c299ed5c3c40e0c529a3f06b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpUserClaimsPrincipalFactory.cs#L14
this is the code I tried :
public class AbpUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<IdentityUser, IdentityRole>, ITransientDependency { public AbpUserClaimsPrincipalFactory( UserManager<IdentityUser> userManager, RoleManager<IdentityRole> roleManager, IOptions<IdentityOptions> options) : base( userManager, roleManager, options) { }
[UnitOfWork]
public override async Task<ClaimsPrincipal> CreateAsync(IdentityUser user)
{
var principal = await base.CreateAsync(user).ConfigureAwait(false);
if (user.TenantId.HasValue)
{
principal.Identities
.First()
.AddClaim(new Claim(AbpClaimTypes.TenantId, user.TenantId.ToString()));
}
return principal;
}
}
(I tried this code in Administration Service Domain project)
but when using it, the login page will just stay there even after clicking the login button with correct credentials, it doesn't redirect to the angular app.
I want to know how exactly the CurrentUser is assigned these values and I want to override it because we have different logic of fetching the roles (from our custom table). I specifically want to know how the roles are assigned to the current user.
Right now, what I have done is, I have manually updated the value of the RoleId in the AbpUserRoles table, I have updated the RoleId with the one which belongs to the host. And because of that when the user logs into the application, there in, the api/abp/application-configuration?includeLocalizationResources=false api is called and in response of that API call, the grantedPolicies in the "auth" section is an empty array and in the "currentUser" section the roles is an empty array.
example : { "auth": { "grantedPolicies": [] }, "currentUser": { "roles": [], }, } So, given the scenario, how exactly can I set these granted policies and the currentUser values in the application when the user logs in?
I have a microservice template project with Angular UI. Here I have a microservice called FormsService, and I am using one of the API endpoints of this microservice in my AuthServer. For the FormsService I am using the dynamic proxies to detect the API endpoints when used as a remote service in any other service (AuthServer in my case). I have used AddHttpClientProxies method in my FormsServiceHttpApiClientModule file to configure the dynamic proxies. And in my AuthServer's appsettings.json I have written
"RemoteServices": { "Default": { "BaseUrl": "https://localhost:44325" } }
so that it can redirect to the WebGateway (port: 44325) and from there it should be re-routed to the FormsService's API endpoint.
In order to use the dynamic proxy for the FormsService, I have also given the dependency of FormsServiceHttpApiClientModule in the WebGateway project (AuthServerModule.cs file).
I was previously using the ABP version 7.3.2, and now I have upgraded it to version 8.2.1. In the older version it was working fine, but in the 8.2.1 version it's giving the following error while trying to use that endpoint from AuthServer (I have given the reference of FormsService in the AuthServer and there in the Register.cs file I have injected the AppService in the constructor of Register.cs file and using the method of that AppService):
An unhandled exception occurred while processing the request. AbpException: Could not find remote action for method: System.Threading.Tasks.Task`1[Volo.Forms.Forms.FormWithDetailsDto] GetRegistrationFormAsync(System.Guid) on the URL: https://localhost:44325 Volo.Abp.Http.Client.DynamicProxying.ApiDescriptionFinder.FindActionAsync(HttpClient client, string baseUrl, Type serviceType, MethodInfo method)
Please suggest.
We are trying run performance testing on the application using the Apache JMeter. Following api calls (total 3) are getting errors while testing the application, can you suggest what can be done this issue?
API Call 1 : https://scopeuat.doctrz.in:44322/Account/Login Request body: GET https://scopeuat.doctrz.in:44322/Error?httpStatusCode=400
GET data:
Cookie Data: .AspNetCore.Antiforgery.YkhOIqalreE=CfDJ8DXz2n710ANCtQZrCmvoKDgN-wZi7vEdV5z7fK1KBGOe0D9GAjDDTqNYLfyifxyyqg2gbQYVDJumTjFKNgY2FIbVv4SVD6noo2LPnSaww0R2TL1O3cIcjWDOblIZCbTDvZ5qZak0HxUtvlIcATPp_Hs; XSRF-TOKEN=CfDJ8DXz2n710ANCtQZrCmvoKDjdqFVP0xx2TP9QdW0hwVvg8fO7JOBtca5vdKczKpyNz2zIX4vpwTqNlTlFuZiCw8cYmL2t1bpwhp0jTjrQBz2kl5Y-3wKBgXf6meVvOkCOabI2bQe-hgvVok4ECWsH1gw
Request Headers: Connection: keep-alive Upgrade-Insecure-Requests: 1 Content-Type: application/x-www-form-urlencoded Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.7 sec-ch-ua: "Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126" sec-ch-ua-mobile: ?0 sec-ch-ua-platform: "Windows" User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 DNT: 1 Host: scopeuat.doctrz.in:44322
API Call 2 : https://scopeuat.doctrz.in:44322/connect/token
Request Body: POST https://scopeuat.doctrz.in:44322/connect/token
POST data: code=P7kLRlQDL4csWrX_hroS54eq6_eyV2wq7UKGI1q47Yc&grant_type=authorization_code&redirect_uri=https%3A%2F%2Fscopeuat.doctrz.in&client_id=Angular&code_verifier=N2ZZVXRETGJXMVBpQWlJak8xdmhXTURKTTNNfjBqM1RqVHQxbkUzZ0Z5OWRO
Cookie Data: .AspNetCore.Antiforgery.YkhOIqalreE=CfDJ8DXz2n710ANCtQZrCmvoKDgN-wZi7vEdV5z7fK1KBGOe0D9GAjDDTqNYLfyifxyyqg2gbQYVDJumTjFKNgY2FIbVv4SVD6noo2LPnSaww0R2TL1O3cIcjWDOblIZCbTDvZ5qZak0HxUtvlIcATPp_Hs; .AspNetCore.Culture=c%3Den%7Cuic%3Den; XSRF-TOKEN=CfDJ8DXz2n710ANCtQZrCmvoKDh0Esh26DPIyYi9XaISAV31KUy9Ylr0ya2zMf7XBjGYQvE7tnW1niA45coeiacFhjm0UZdhWJI2PhNPrxxf6mlmJYZ34Ku8AbZryQpJQuwyjF1Cn_h_orIse-Vr2ZrmnyI Request Headers: Connection: keep-alive Content-Type: application/x-www-form-urlencoded __tenant: 3a10d8ba-84c1-030b-2672-709df3812b9d Accept: application/json, text/plain, / X-Requested-With: XMLHttpRequest sec-ch-ua: "Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126" sec-ch-ua-mobile: ?0 sec-ch-ua-platform: "Windows" User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 DNT: 1 Content-Length: 217 Host: scopeuat.doctrz.in:44322
API Call 3: https://uat.doctrz.in:44325/api/appointment-service/session/list
Request Body: POST https://uat.doctrz.in:44325/api/appointment-service/session/list
POST data: {"maxResultCount":10,"skipCount":0,"SessionQuestionId":"3a131f0f-98f4-dbde-56ee-909b142b20c7","ConsultationFormInputs":[]}
Cookie Data: .AspNetCore.Antiforgery.YkhOIqalreE=CfDJ8DXz2n710ANCtQZrCmvoKDioKzEaKYBj_fCFdfY7smIqk5oFIiI9jUCMBMuJMra_h_EUn_xr4dXReZJJcqFB5zbqUAXgnNpWdUfg18JfN7oQC8Diei6Dyn6XNsA7AD5TJbXGZbgoqJ82g4LqoC46wiw; XSRF-TOKEN=CfDJ8DXz2n710ANCtQZrCmvoKDhHsn44MTQJmXJbM1_MXOn7M6ncReye0lT9-MjgOeZeFC2ucYTCjn6VAfiTZsempLEERqS7ba0UgWbDbwhUBxyhTD21hoMWQDzGy0FhX3yXaLKCdD-JcbP6I3Yg-va7dbU; __tenant=3a10d95d-cc01-d739-974d-f5ae592edbd8; .AspNetCore.Culture=c%3Den%7Cuic%3Den Request Headers: Connection: keep-alive Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjA1MTU5NTE4RDdDNDI3MTJFQ0VBMTgwOEZDRUQzRkE2MTBDQzkwMzQiLCJ4NXQiOiJCUldWR05mRUp4THM2aGdJX08wX3BoRE1rRFEiLCJ0eXAiOiJhdCtqd3QifQ.eyJzdWIiOiIzYTEwZDk1ZC1jYzVkLTdhZTYtMjFjYi00YjkyMzg0NTdjMmUiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbiIsImVtYWlsIjoic2NvcGV1c2VyQHRlc3QuY29tIiwicm9sZSI6ImFkbWluIiwidGVuYW50aWQiOiIzYTEwZDk1ZC1jYzAxLWQ3MzktOTc0ZC1mNWFlNTkyZWRiZDgiLCJnaXZlbl9uYW1lIjoiYWRtaW4iLCJwaG9uZV9udW1iZXJfdmVyaWZpZWQiOiJGYWxzZSIsImVtYWlsX3ZlcmlmaWVkIjoiRmFsc2UiLCJ1bmlxdWVfbmFtZSI6ImFkbWluIiwib2lfcHJzdCI6IkFuZ3VsYXIiLCJpc3MiOiJodHRwczovL3VhdC5kb2N0cnouaW46NDQzMjIvIiwib2lfYXVfaWQiOiIzYTEwZGNhMi02ODA1LWM2ZGUtNmEyYy1hZGMyNzExMmZjYzkiLCJjbGllbnRfaWQiOiJBbmd1bGFyIiwib2lfdGtuX2lkIjoiM2ExMzdlYzUtMzU3NC03NzY1LTU2YWUtOWYwNWY4MDY2MTgwIiwiYXVkIjpbIkFjY291bnRTZXJ2aWNlIiwiSWRlbnRpdHlTZXJ2aWNlIiwiQWRtaW5pc3RyYXRpb25TZXJ2aWNlIiwiU2Fhc1NlcnZpY2UiLCJQcm9kdWN0U2VydmljZSIsIkNsaW5pY1NlcnZpY2UiLCJBcHBvaW50bWVudFNlcnZpY2UiLCJGb3Jtc1NlcnZpY2UiXSwic2NvcGUiOiJvZmZsaW5lX2FjY2VzcyBvcGVuaWQgcHJvZmlsZSBlbWFpbCBwaG9uZSBBY2NvdW50U2VydmljZSBJZGVudGl0eVNlcnZpY2UgQWRtaW5pc3RyYXRpb25TZXJ2aWNlIFNhYXNTZXJ2aWNlIFByb2R1Y3RTZXJ2aWNlIENsaW5pY1NlcnZpY2UgQXBwb2ludG1lbnRTZXJ2aWNlIEZvcm1zU2VydmljZSIsImp0aSI6ImQzNmM4MmU1LTc3NTctNDY2NC04Yjc0LTNhOWNhNDM0MzNiMyIsImV4cCI6MTcxOTgxMjQ0MywiaWF0IjoxNzE5ODA4ODQzfQ.be1d_CTREeFMhFFxOezkFo_SHCnX9Rs2acel5-MDt-xoEkeeFJAuYHWmbjgnBsJTXO-uqeat-FdxFFFMeL0bVvWYjAwMLZEJh93C9EapYuQUEl8ayLwHNN_1dD-T6RavqX2RB_3YSAa5cno57xOhEvx0YZ58VDzV9yWLaM8h9Bu6Kn9qdiAzjpXIX4wuj7-O95e6-_0q8754m4khFIirCtUMJTfqSnF6yrTVaaTwqVNxc19pDbr7KZsLUQqBc7oOy34jS3DL7HeBeP2pJzGoz6cDAI0PWmVGeUg5QlnBGIWhUqY36q5AFCScTnWVhgatfulghaTYcV7i79ARw_Y4XA Content-Type: application/json __tenant: 3a10d95d-cc01-d739-974d-f5ae592edbd8 Accept: application/json, text/plain, / X-Requested-With: XMLHttpRequest sec-ch-ua: "Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126" sec-ch-ua-mobile: ?0 sec-ch-ua-platform: "Windows" User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 DNT: 1 Content-Length: 122 Host: uat.doctrz.in:44325
I have the Auth Server in the form of an MVC application. I had to do some customizations in the Login and Register pages of the Auth Server. In order to do so I have downloaded the Account module using abp suite, pciked up the Login.cshtml.cs, Login.cshtml, Register.cshtml.cs and Register.cshtml files at the required directory. I am able to customize those pages, but the reCaptcha is not getting displayed after I put those files in my project. When I try to inspect the application, it shows the recaptcha element in the Elements section, but it doesn't actually appear on the UI. Can you suggest what should I do?
I want to implement sub-domain functionality in my application. I followed the following document to do so, but I wasn't able to configure it. https://docs.abp.io/en/abp/latest/Multi-Tenancy
I added the below code in the PreConfigureServices method in my Auth Server Module.cs file :
PreConfigure<AbpOpenIddictWildcardDomainOptions>(options =>
{
options.EnableWildcardDomainSupport = true;
options.WildcardDomainsFormat.Add("https://{0}.localhost");
});
And added the below code in the ConfigureServices method in my Auth Server Module.cs file :
Configure<AbpTenantResolveOptions>(options =>
{
options.AddDomainTenantResolver("{0}.localhost");
});
I also updated the appsettings.json file which will accept all the sub-domains as of now (used * wildcard). I have added a test sub-domain name in my machine (test.localhost)
The angular application is working on http://test.localhost:4200/ But the Auth Server application is not running on https://test.localhost:44322/Account/Login
It's getting the following error
However, its working fine on https://localhost:44322/Account/Login
Can you tell me what can be the issue here?
yCheck the docs before asking a question: https://docs.abp.io/en/commercial/latest/ Check the samples to see the basic tasks: https://docs.abp.io/en/commercial/latest/samples/index The exact solution to your question may have been answered before, and please first use the search on the homepage. Provide us with the following info:
We have a global-styles.css file to apply customized css in our applicaton. But it's not showing any impact on the Auth Server project that we have. It's not applying there. Can you tell us how can we achieve that?
I have done some customization in my Auth-Server project (MVC). When I enter my user credentials and click on Login button, it redirects me to my angular application (I have done customization for it in the Login.cshtml.cs file, on OnPostAsync method I am returning my Angular app's url).
ConfigValues.AngularAppUrl holds my angular app url
return Redirect(ConfigValues.AngularAppUrl);
The problem is, when I click on the Login button, it does redirect to the angular app, but it will not be logged in as a user but rather just the outside page of it. And once and only when I click on the login icon on my angular application page, then it will log in as a user (see the flow below).
I want a way where on clicking the Login button in the Auth Server (first image), I should be redirected to the angular application with user logged in.
I am working on the Auth Server project (independent). I have a requirement where I want to put some extra input fields on the Registration page of auth server. I'd collect the values of those extra input fields and will store those values in my other database table (separate from the ones provided by ABP). I am even able to carry out the whole process and am successfully able to store the data in the database without altering the existing configuration. I am fetching the details of those input fields from my database and storing them in a variable in the Register.cshtml.cs file. And I am using that variable to display those input fields on UI.
Now, here the problem is, that if I have any kind of a validation error (username already taken for example), and if I try to submit at this point, the application will pop out the validation error, saying this username is already taken, which is fine. But all my input fields get disappeared as soon as there is some validation error. I think this is happening because the class is losing all of it's values as soon as there is any validation error and hence it resets all the variables of the class and hence my variable (which stores the input field details), also gets reset and therefore loses all the details and it doesn't appear on the UI.
Is there a way to keep the value of that variable held during the entire time? Any kind of annotation or something? Please suggest.