|
After Width: | Height: | Size: 281 KiB |
|
After Width: | Height: | Size: 504 KiB |
|
After Width: | Height: | Size: 498 KiB |
|
Before Width: | Height: | Size: 297 KiB |
|
Before Width: | Height: | Size: 304 KiB |
@ -1,59 +1,118 @@ |
|||
BASTA! Mainz 2023 has wrapped up, and what an extraordinary journey it has been! We can’t wait to share our impressions, highlights, and the incredible impact it had on the tech community in Germany and beyond. |
|||
|
|||
### A Glance Back at BASTA! Mainz 2023
|
|||
|
|||
|
|||
We just came back from the[ BASTA! Conference 2023](https://basta.net/), which is an incredible .NET event with over 600 in-person attendees and an additional 200+ tuning in virtually from across the globe. The buzz of excitement and anticipation in the air was undeniable, setting the stage for an unforgettable event for [ABP.IO](https://abp.io/). |
|||
|
|||
 |
|||
|
|||
 |
|||
|
|||
 |
|||
|
|||
As one of the proud sponsors, we set up our booth, engaged with attendees, and delved into a wide range of sessions, workshops, and keynotes to absorb the latest software development trends. |
|||
|
|||
### Engaging with Enthusiastic Minds
|
|||
|
|||
|
|||
As the lead developers of ABP Core Team, *[Alper](https://twitter.com/alperebicoglu)* and *[Ismail](https://twitter.com/ismcagdas)* presented the ABP.IO platform modules and features were quite busy enjoying their presenting work with latest version of demos. Alper also gave a great speech on “Building Multi-tenant ASP.NET Core Application & the ABP Framework” at the BASTA! Mainz conference. |
|||
|
|||
 |
|||
|
|||
 |
|||
|
|||
We introduced **[ABP Framework](https://abp.io/)**, community-driven open-source web application framework, and **[ABP Commercial](https://commercial.abp.io/)**, our enterprise-ready web development platform that is built on top of the open-source ABP Framework to the crowds. |
|||
|
|||
 |
|||
|
|||
 |
|||
|
|||
 |
|||
|
|||
Apart from that, we were thrilled to give away the **[ABP Commercial Licenses](https://commercial.abp.io/pricing)** to the eager attendees on the venue, including the Raffle prize, **Meta Quest 2**, on our last day in BASTA! Conference. |
|||
|
|||
 |
|||
|
|||
We are profoundly satisfied with the huge interest and engagement shown by the attendees. The sense of community, collaboration, and shared passion for .NET solutions was palpable throughout the event. |
|||
|
|||
 |
|||
|
|||
 |
|||
|
|||
 |
|||
|
|||
### A Great Partnership with LIS GmbH
|
|||
|
|||
|
|||
 |
|||
|
|||
At BASTA! Mainz 2023, we were particularly thrilled to celebrate our collaboration with ***LIS GmbH***, a leading software solutions provider. This partnership added a unique dimension to the conference, brought us a fresh perspective to the conference, fostering innovation and opening up new avenues for attendees. |
|||
|
|||
### A Big Thank-You from ABP Team
|
|||
|
|||
|
|||
 |
|||
|
|||
Now, a shout-out to BASTA! Mainz 2023. We want to thank to everyone who contributed to the success of this event – attendees, speakers, sponsors, and partners.The conference may have ended, but the knowledge gained, connections formed, and inspiration ignited will continue to shape the tech landscape for years to come. |
|||
|
|||
Until next time! |
|||
BASTA! Mainz 2023 has wrapped up, and what an extraordinary journey it has been! We can’t wait to share our impressions, highlights, and the incredible impact it had on the tech community in Germany and beyond. |
|||
|
|||
|
|||
|
|||
### A Glance Back at BASTA! Mainz 2023 |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
We just came back from the[ BASTA! Conference 2023](https://basta.net/), which is an incredible .NET event with over 600 in-person attendees and an additional 200+ tuning in virtually from across the globe. The buzz of excitement and anticipation in the air was undeniable, setting the stage for an unforgettable event for [ABP.IO](https://abp.io/). |
|||
|
|||
|
|||
|
|||
 |
|||
|
|||
|
|||
|
|||
 |
|||
|
|||
|
|||
|
|||
 |
|||
|
|||
|
|||
|
|||
As one of the proud sponsors, we set up our booth, engaged with attendees, and delved into a wide range of sessions, workshops, and keynotes to absorb the latest software development trends. |
|||
|
|||
|
|||
|
|||
### Engaging with Enthusiastic Minds |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
As the lead developers of ABP Core Team, *[Alper](https://twitter.com/alperebicoglu)* and *[Ismail](https://twitter.com/ismcagdas)* presented the ABP.IO platform modules and features were quite busy enjoying their presenting work with latest version of demos. Alper also gave a great speech on “Building Multi-tenant ASP.NET Core Application & the ABP Framework” at the BASTA! Mainz conference. |
|||
|
|||
|
|||
|
|||
 |
|||
|
|||
|
|||
|
|||
 |
|||
|
|||
|
|||
|
|||
We introduced **[ABP Framework](https://abp.io/)**, community-driven open-source web application framework, and **[ABP Commercial](https://commercial.abp.io/)**, our enterprise-ready web development platform that is built on top of the open-source ABP Framework to the crowds. |
|||
|
|||
|
|||
|
|||
 |
|||
|
|||
|
|||
|
|||
 |
|||
|
|||
|
|||
|
|||
 |
|||
|
|||
|
|||
|
|||
Apart from that, we were thrilled to give away the **[ABP Commercial Licenses](https://commercial.abp.io/pricing)** to the eager attendees on the venue, including the Raffle prize, **Meta Quest 2**, on our last day in BASTA! Conference. |
|||
|
|||
|
|||
|
|||
 |
|||
|
|||
|
|||
|
|||
We are profoundly satisfied with the huge interest and engagement shown by the attendees. The sense of community, collaboration, and shared passion for .NET solutions was palpable throughout the event. |
|||
|
|||
|
|||
|
|||
 |
|||
|
|||
|
|||
|
|||
 |
|||
|
|||
|
|||
|
|||
 |
|||
|
|||
|
|||
|
|||
### A Great Partnership with LIS GmbH |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
 |
|||
|
|||
|
|||
|
|||
|
|||
At BASTA! Mainz 2023, we were particularly thrilled to celebrate our collaboration with ***LIS GmbH***, a leading software solutions provider. This partnership added a unique dimension to the conference, brought us a fresh perspective to the conference, fostering innovation and opening up new avenues for attendees. |
|||
|
|||
|
|||
|
|||
### A Big Thank-You from ABP Team |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
 |
|||
|
|||
|
|||
|
|||
Now, a shout-out to BASTA! Mainz 2023. We want to thank to everyone who contributed to the success of this event – attendees, speakers, sponsors, and partners.The conference may have ended, but the knowledge gained, connections formed, and inspiration ignited will continue to shape the tech landscape for years to come. |
|||
|
|||
|
|||
|
|||
Until next time! |
|||
|
|||
@ -0,0 +1,134 @@ |
|||
# URL-Based Localization |
|||
|
|||
In this article I'll show you how to optimize your ABP website localization with a URL parameter. URL Paths are commonly being used to change the current UI culture. This method makes our website SEO-Friendly as you structuring the URLs for multiple languages. And you can also share the link of your website with a specific language. Let's see implementing multi-language support with URL parameters in an ABP project. |
|||
|
|||
 |
|||
|
|||
|
|||
|
|||
## Mastering Website Localization: Language Codes in URLs Explained |
|||
|
|||
Enhancing UX with URL-Based website localization is mainly done with ASP.NET Core's routing system. Also we need to automatically redirect the links without language code parameter. Our URL structures for the localization will be as following: |
|||
|
|||
- https://mywebsite.com/en/dashboard (English) |
|||
- https://mywebsite.com/tr/dashboard (Turkish) |
|||
|
|||
|
|||
|
|||
## Routing |
|||
|
|||
Before starting to explain how to do this, you can see [this commit](https://github.com/salihozkara/MultiLangRoute/commit/09e40cfd751562dec0dab890e54e0c5ca9ee256c) which implements this functionality. The routing module consists of these fundamental classes: |
|||
|
|||
### 1. **MultiLanguageSupportMetaData.cs** |
|||
|
|||
This class is used to add a language parameter to route templates. For example, it changes the `/about` route to `/language/about`. |
|||
|
|||
### 2. **MultiLanguageRedirectRequiredMetaData.cs** |
|||
|
|||
This class is used to redirect users to the correct language version. If a user visits the `/about` page and the current culture is `"tr-TR"`, this class will redirect them to `/tr-TR/about`. |
|||
|
|||
### 3. **UrlNormalizer.cs** |
|||
|
|||
This static class is used to normalize URLs by adding language information and improving performance using caching. |
|||
|
|||
```csharp |
|||
public static string NormalizeUrl(EndpointDataSource endpointDataSource, HttpContext httpContext, string url) |
|||
{ |
|||
// Normalize the URL and cache it |
|||
return Cache.GetOrAdd(url, (key) => |
|||
{ |
|||
var absoluteUrl = GetAbsoluteUrl(key); |
|||
var multiLanguageRedirectRequiredMetaData = |
|||
GetMultiLanguageRedirectRequiredMetaData(endpointDataSource, absoluteUrl); |
|||
return multiLanguageRedirectRequiredMetaData?.ReBuildUrl(httpContext, key) ?? key; |
|||
}); |
|||
} |
|||
``` |
|||
|
|||
### 4. **MyLinkGenerator.cs** |
|||
|
|||
This class extends ASP.NET Core’s `LinkGenerator` class to automatically add language information to all generated links. |
|||
|
|||
### 5. **MyRouteDataRequestCultureProvider.cs** |
|||
|
|||
This class determines the current culture using the language parameter in the URL. For example, it extracts the `"tr-TR"` culture from the `/tr-TR/about` URL. |
|||
|
|||
### 6. **RoutingMiddleware.cs** |
|||
|
|||
This middleware processes HTTP requests and redirects users to the correct language version when necessary. |
|||
|
|||
```csharp |
|||
public override Task InvokeAsync(HttpContext context, RequestDelegate next) |
|||
{ |
|||
var endpoint = context.GetEndpoint(); |
|||
if(endpoint is not RouteEndpoint) |
|||
{ |
|||
return next(context); |
|||
} |
|||
|
|||
// Redirect if necessary |
|||
var redirectMetaData = endpoint.Metadata.GetMetadata<IRedirectMetaData>(); |
|||
if (redirectMetaData is not null) |
|||
{ |
|||
redirectMetaData.Redirect(context); |
|||
return Task.CompletedTask; |
|||
} |
|||
|
|||
// ... |
|||
} |
|||
``` |
|||
|
|||
|
|||
|
|||
## CultureAnchorTagHelper.cs |
|||
|
|||
This **Tag Helper** processes `<a>` tags in a Razor page and automatically adds language information to URLs if it's missing. |
|||
|
|||
```csharp |
|||
[HtmlTargetElement("a", Attributes = "href", TagStructure = TagStructure.NormalOrSelfClosing)] |
|||
public class CultureAnchorTagHelper(EndpointDataSource endpointDataSource, IHttpContextAccessor contextAccessor) |
|||
: TagHelper, ITransientDependency |
|||
{ |
|||
public override void Process(TagHelperContext context, TagHelperOutput output) |
|||
{ |
|||
var href = output.Attributes["href"].Value.ToString(); |
|||
if (href != null) |
|||
{ |
|||
output.Attributes.SetAttribute("href", |
|||
UrlNormalizer.NormalizeUrl(endpointDataSource, contextAccessor.HttpContext!, href)); |
|||
} |
|||
} |
|||
} |
|||
``` |
|||
|
|||
**How This Tag Helper Works:** |
|||
|
|||
- Finds all `<a href="...">` tags within your Razor pages. |
|||
- Retrieves the `href` attribute of each link. |
|||
- Uses the `UrlNormalizer.NormalizeUrl()` method to normalize the URL with the current culture information. |
|||
- Replaces the original URL with the normalized one. |
|||
|
|||
For example, if the current culture is `"tr"` and a page contains `<a href="/about">`, this Tag Helper will transform it into `<a href="/tr-TR/about">`. |
|||
|
|||
|
|||
|
|||
## Sample Project |
|||
|
|||
Salih Özkara from ABP team created a sample working project which implements URL localization. He used ABP free tier MVC template and MongoDB. You can check out the related commit which implements URL localization: |
|||
|
|||
https://github.com/salihozkara/MultiLangRoute/commit/09e40cfd751562dec0dab890e54e0c5ca9ee256c |
|||
|
|||
And full working demo is available at: |
|||
|
|||
https://github.com/salihozkara/MultiLangRoute |
|||
|
|||
You can download the demo project at: |
|||
|
|||
[UrlLocalizationSampleProject.zip](https://github.com/abpframework/abp/blob/634ff52fb07d0b1281640695dbeffccdc943ca53/docs/en/Community-Articles/2024-03-05-URL-Based-Localization/UrlLocalizationSampleProject.zip) |
|||
|
|||
|
|||
|
|||
## Summary |
|||
|
|||
This implementation extends ASP.NET Core’s routing mechanism and utilizes caching for improved performance. It ensures multilingual support by normalizing URLs, redirecting users to the appropriate language version, and automatically handling language-specific links. |
|||
|
|||
|
After Width: | Height: | Size: 588 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 3.5 MiB |
@ -0,0 +1,179 @@ |
|||
 |
|||
|
|||
# Using Pushed Authorization Requests In ABP Framework |
|||
|
|||
`Pushed Authorization Requests (PAR)` is a new `OAuth 2.0` feature that allows clients to push the payload of an `OAuth 2.0` authorization request to the authorization server via a direct request and provides them with a request URI that is used as reference to the data in a subsequent call to the authorization endpoint. This feature is defined in [RFC 9156](https://tools.ietf.org/html/rfc9156). |
|||
|
|||
## Authorization Code Flow |
|||
|
|||
Let's examine the current `Code Flow` in the ABP Framework project. |
|||
|
|||
A typical ABP layered architecture usually includes the following projects: |
|||
|
|||
- `Acme.AuthServer`: OAuth 2.0 authorization server integrated with `OpenIddict`. |
|||
- `Acme.HttpApi.Host`: API project that uses the `JWT Bearer` authentication scheme and authenticates through the `Acme.AuthServer` project. |
|||
- `Acme.Web`: An UI project configured with an `OpenID Connect` authentication scheme to authenticate through the `Acme.AuthServer` project. |
|||
|
|||
When we attempt to use `OpenID Connect` authentication in the `Acme.Web` project, it constructs an authorization request and redirects the browser to the `Acme.AuthServer` project. |
|||
|
|||
```csharp |
|||
GET https//auth-server.acme.com/connect/authorize |
|||
|
|||
Query String Parameters: |
|||
|
|||
client_id: AbpApp |
|||
redirect_uri: https://web.acme.com/signin-oidc |
|||
response_type: code |
|||
scope: openid profile email roles phone AbpAPI |
|||
response_mode: form_post |
|||
nonce: YzVkMj... |
|||
state: CfDJ8N... |
|||
``` |
|||
|
|||
> If you have enabled `Pkce`, the `code_challenge` and `code_challenge_method` parameters will also appear in the request. |
|||
|
|||
```csharp |
|||
code_challenge: mJxMdU... |
|||
code_challenge_method: S256 |
|||
``` |
|||
|
|||
After the user successfully authenticates on the `Acme.AuthServer` project (via username/password or social login providers) and approves the requested permissions on the consent screen/page, it returns a `code` to the `Acme.Web` project. |
|||
|
|||
The `Acme.AuthServer` project will construct either a `POST` or `GET` request to the `Acme.Web` project. |
|||
|
|||
```csharp |
|||
POST https://web.acme.com/signin-oidc |
|||
|
|||
Form Data Parameters(application/x-www-form-urlencoded): |
|||
|
|||
code: LPjZ6C... |
|||
state: state: CfDJ8N... |
|||
iss: https://auth-server.acme.com/ |
|||
``` |
|||
|
|||
When the `Acme.Web` project receives the `code`, it sends an HTTP request from the application (**not the browser**) to `Acme.AuthServer` to request an `access token` using the received `code`. |
|||
|
|||
```csharp |
|||
POST https://auth-server.acme.com/connect/token |
|||
|
|||
Form Data Parameters(application/x-www-form-urlencoded): |
|||
|
|||
client_id: AbpApp |
|||
client_secret: secret |
|||
code: LPjZ6C... |
|||
grant_type: authorization_code |
|||
``` |
|||
|
|||
At this point, the `Code Flow` authentication process is complete, and we can use the `access token` to access APIs on the `Acme.HttpApi.Host` project. |
|||
|
|||
> The `Hybrid Flow` and `Implicit Flow` are similar to `Code Flow`. We'll focus on `Code Flow` in this discussion. |
|||
|
|||
However, `Code Flow` may have the following issues: |
|||
|
|||
* The authorization request can be altered. Usually, the client application redirects the user's browser to the authorization server with the authorization URL. Nothing prevents a malicious actor from changing one or more parameters of this request before sending it to the authorization server. |
|||
* No guarantee of the request's provenance. The authorization request is normally built by the client application, and the user's browser is in charge of sending it to the authorization server. However, there is no guarantee that the request has been built by the client application. Anyone can build an authorization request once they know a few data, such as the client ID and the redirect URI. |
|||
* No guarantee of confidentiality. Although the browser sends the authorization request via HTTPS, the request parameters can be intercepted by third-party applications, such as a proxy, a load balancer, or even a browser plugin. A malicious network component of this type can inject or change the request parameters, not to mention that the request itself can be logged. |
|||
* Browser limitations. Finally, a very complex query string in the authorization request may incur possible browser limitations on URL length. |
|||
|
|||
OAuth 2.0 defined `Pushed Authorization Requests (PAR)` to address these issues. |
|||
|
|||
## Pushed Authorization Requests (PAR) |
|||
|
|||
[OpenIdDict 6.1.0](https://documentation.openiddict.com/configuration/pushed-authorization-requests) started supporting `Pushed Authorization Requests (PAR)`. The ABP Framework(`>=9.2.0`) promptly upgraded its `OpenIddict` version and added PAR configuration in the [Volo.OpenIddict.Pro module](https://abp.io/modules/Volo.OpenIddict.Pro). |
|||
|
|||
You can configure `Pushed Authorization Requests (PAR)` when `creating/updating` an `Application`. |
|||
|
|||
 |
|||
|
|||
Let's examine the authentication flow using `Pushed Authorization Requests (PAR)`. |
|||
|
|||
When we attempt to use OpenID Connect authentication in the `Acme.Web` project, it sends an HTTP request from the application (**not the browser**) to the authorization server's `par` endpoint. |
|||
|
|||
```csharp |
|||
POST https://auth-server.acme.com/connect/par |
|||
|
|||
Form Data Parameters: |
|||
|
|||
client_id: AbpApp |
|||
client_secret: secret |
|||
redirect_uri: https://web.acme.com/signin-oidc |
|||
response_type: code |
|||
scope: openid profile email roles phone AbpAPI |
|||
response_mode: form_post |
|||
nonce: YzVkMjZmN... |
|||
state: CfDJ8NwA4... |
|||
``` |
|||
|
|||
> If you have enabled `Pkce`, the code_challenge and code_challenge_method parameters will also appear in the `POST` request. |
|||
|
|||
```csharp |
|||
code_challenge: mJxMdULFXnvdWfaDUfyDIb77IFlMpGyKkHN1_UWYKDk |
|||
code_challenge_method: S256 |
|||
``` |
|||
|
|||
After successful verification and validation, the authorization server returns a `request_uri` to the `Acme.Web` application. |
|||
|
|||
```json |
|||
{ |
|||
"request_uri": "urn:ietf:params:oauth:request_uri:1FPVWnrwFAesetV-r-66_b7BAF_vCQm7UmPWfBqRENg", |
|||
"expires_in": 3599 |
|||
} |
|||
``` |
|||
|
|||
Upon receiving a successful response, the `Acme.Web` project constructs an authorization request and redirects the browser to the authorization server. |
|||
|
|||
```csharp |
|||
GET https//auth-server.acme.com/connect/authorize |
|||
|
|||
Query String Parameters: |
|||
client_id: AbpApp |
|||
request_uri: urn:ietf:params:oauth:request_uri:1FPVWnrwFAesetV-r-66_b7BAF_vCQm7UmPWfBqRENg |
|||
``` |
|||
|
|||
Similarly, after the user authorizes on the `Acme.AuthServer` project, it returns a `code` to the `Acme.Web` project, which can then be used to request an `access token`, just like in the standard `Code Flow` described above. |
|||
|
|||
## Configuring and Enabling PAR in ABP Application |
|||
|
|||
The ABP [OpenIddict module](https://abp.io/modules/Volo.OpenIddict) enables the `PAR` feature by default. |
|||
|
|||
In ASP.NET Core 9.0, the [OpenIdConnect authentication handler](https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.OpenIdConnect)'s [OpenIdConnectOptions](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.authentication.openidconnect.openidconnectoptions) includes a new [PushedAuthorizationBehavior](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.authentication.openidconnect.openidconnectoptions.pushedauthorizationbehavior) parameter that you can configure in your application. |
|||
|
|||
| Name | Description| |
|||
|-|-| |
|||
| UseIfAvailable | Use Pushed Authorization (PAR) if the PAR endpoint is available in the identity provider's discovery document or the explicit OpenIdConnectConfiguration. **This is the default value.** | |
|||
| Disable| Never use Pushed Authorization (PAR), even if the PAR endpoint is available in the identity provider's discovery document or the explicit OpenIdConnectConfiguration. If the identity provider's discovery document indicates that it requires Pushed Authorization (PAR), the handler will fail. | |
|||
| Require | Always use Pushed Authorization (PAR), and emit errors if the PAR endpoint is not available in the identity provider's discovery document or the explicit OpenIdConnectConfiguration. | |
|||
|
|||
```csharp |
|||
AddAbpOpenIdConnect("oidc", options => |
|||
{ |
|||
//... |
|||
options.PushedAuthorizationBehavior = PushedAuthorizationBehavior.Require; |
|||
//... |
|||
}); |
|||
``` |
|||
|
|||
The `UseIfAvailable` value is the default behavior, and ABP has enabled the `PAR` endpoint globally. Make sure all your web applications have been granted the `OpenIddictConstants.Permissions.Endpoints.PushedAuthorization` permission to use the PAR endpoint. If not, you should disable the `PushedAuthorizationBehavior` in the `OpenIdConnectOptions`. |
|||
|
|||
```csharp |
|||
AddAbpOpenIdConnect("oidc", options => |
|||
{ |
|||
//... |
|||
options.PushedAuthorizationBehavior = PushedAuthorizationBehavior.Disable; |
|||
//... |
|||
}); |
|||
``` |
|||
|
|||
> Not all authentication clients support PAR. For example, Blazor WASM does not yet support it. |
|||
|
|||
## Summary |
|||
|
|||
`Pushed Authorization Requests (PAR)` is a security enhancement for `OAuth 2.0` that significantly improves the security and reliability of the `authorization code flow`. Given its security benefits, we strongly recommend implementing `PAR` in your production applications. |
|||
|
|||
## References |
|||
|
|||
- [Volo.OpenIddict.Pro module](https://abp.io/modules/Volo.OpenIddict.Pro) |
|||
- [What Are OAuth Pushed Authorization Requests (PAR)?](https://auth0.com/blog/what-are-oauth-push-authorization-requests-par/) |
|||
- [OpenIddict Pushed Authorization Requests (PAR)](https://documentation.openiddict.com/configuration/pushed-authorization-requests) |
|||
- [Support for Pushed Authorization (PAR) in OIDC Handler](https://github.com/dotnet/aspnetcore/pull/55069) |
|||
- [RFC 9156](https://tools.ietf.org/html/rfc9156) |
|||
|
After Width: | Height: | Size: 974 KiB |
|
After Width: | Height: | Size: 323 KiB |
|
After Width: | Height: | Size: 185 KiB |
|
After Width: | Height: | Size: 212 KiB |
|
After Width: | Height: | Size: 250 KiB |
@ -0,0 +1,28 @@ |
|||
We are excited to share some fantastic news with our community! We are proud to announce that ABP.IO is going to be at the BASTA! Conference on March 03-07, 2025 in Frankfurt and İsmail Çağdaş from our dev team is going to be a speaker on March 04! |
|||
|
|||
#### **About BASTA!**
|
|||
For those who don’t know, BASTA! is the leading independent conference for Microsoft technologies in the German-speaking world. For over 20 years, it has been setting standards in the areas of C#, .NET and cloud and web technologies and is considered a must-attend event for Microsoft, cloud, web developers and key players in the software industry. BASTA! is a conference for developers and IT professionals who want to stay up to date with the latest technologies. |
|||
|
|||
#### **ABP at [BASTA! Mainz 2023](https://abp.io/blog/BASTA-Mainz-2023-What-a-Blast-in-Germany)**
|
|||
 |
|||
|
|||
 |
|||
|
|||
 |
|||
#####
|
|||
#### **What to Expect at [BASTA! 2025](https://basta.net/frankfurt-en/)**
|
|||
The most exciting part is İsmail Çağdaş from the ABP developer team will be speaking at the conference on March 04 about the concepts of monoliths and microservices will be briefly explored, along with how modular monoliths bring together the advantages of these two architectures. Using the ABP Framework as an example, the session will highlight its modularity features and demonstrate how it can assist in creating and developing a modular monolith application. Finally, best practices for developing modular monoliths will be discussed, showing how these practices can pave the way for transitioning to a microservice-based architecture when necessary. |
|||
|
|||
If you want to find out more information about İsmail Çağdaş's session, [check here](https://basta.net/microservices-apis/modular-monoliths-architecture-abp/?loc=ffm): |
|||
|
|||
#### **Connect with Us**
|
|||
We have exciting raffles and surprises planned at our booth and look forward to sharing more information about our solutions with you there. |
|||
|
|||
#### **Join Us Online**
|
|||
Don't worry if you can't join us in person, our online booth is going to be there for you! The Expo of the online version of BASTA! is open for the main conference days. |
|||
|
|||
Tuesday, March 4, 2025: 9:00 am – approx. 6:00 pm |
|||
|
|||
Wednesday, March 5, 2025: 9:00 am – approx. 6:00 pm |
|||
|
|||
Thursday, March 6, 2025: 9:00 am – approx. 5:45 pm |
|||
|
After Width: | Height: | Size: 202 KiB |
|
After Width: | Height: | Size: 31 KiB |
@ -1,5 +1,36 @@ |
|||
# KB#0003: Can not login with the admin user |
|||
# KB#0003: Cannot login with the admin user |
|||
|
|||
* Try username `admin` and Password `1q2w3E*`. |
|||
* Try to migrate database. If you have a `DbMigrator` application in your solution, use it. It will seed initial data and create the admin user for you. |
|||
* If not works, read the README.MD file in your solution, or check the [Getting Started](https://abp.io/docs/latest/get-started) document. |
|||
## Use the Correct Username and Password |
|||
|
|||
You may have entered the wrong password. The username is `admin`, and the password is `1q2w3E*`. Note that the password is case-sensitive. |
|||
|
|||
## Forgot to Seed Initial Data |
|||
|
|||
You may need to add migrations and update the database using the EF Core CLI. If your solution includes a `DbMigrator` application, you must run the `DbMigrator` application to seed the initial data. |
|||
|
|||
If your project does not include a `DbMigrator` application, there might be a `migrate-database.ps1` script available. You can use it to migrate and seed the initial data. |
|||
|
|||
> The no-layer application typically support a `--migrate-database` option for migrating and seeding initial data. |
|||
|
|||
> Example: |
|||
> ```bash |
|||
> dotnet run --migrate-database |
|||
> ``` |
|||
|
|||
## Tenant Admin User |
|||
|
|||
If you cannot log in as a tenant admin user, ensure the tenant database is created and seeded, Use the password that was set during tenant creation. |
|||
|
|||
> The tenant seeding process is handled by the template project. If it is not completed, please check the `Logs` file for any error logs. |
|||
|
|||
## Check the `AbpUsers` Table |
|||
|
|||
If you have performed migration and seeded the initial data, check the `AbpUsers` table in the database. Ensure that the user record exists. If your tenant has a separate database, check the tenant database as well. |
|||
|
|||
Passwords are stored in hashed format, not plain text. If you suspect the password is incorrect, you can delete the user record and re-seed the initial data using the `DbMigrator` application or the `migrate-database.ps1` script. |
|||
|
|||
## Other Issues |
|||
|
|||
If the issue persists, refer to the `README.MD` file in your solution or consult the [Getting Started](https://abp.io/docs/latest/get-started) documentation. |
|||
|
|||
Feel free to create an issue in the [ABP GitHub repository](https://github.com/abpframework/abp/issues/new/choose) or contact [ABP Commercial Support](https://abp.io/support/questions/New) for assistance. |
|||
|
|||