From aaa9568d99da3baaf74305ac512d984238d17b18 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Sun, 17 Feb 2019 19:01:33 +0300 Subject: [PATCH] Added Public Web Site section --- docs/en/Samples/Microservice-Demo.md | 98 ++++++++++++++++++ ...icroservice-sample-public-product-list.png | Bin 0 -> 28913 bytes 2 files changed, 98 insertions(+) create mode 100644 docs/en/images/microservice-sample-public-product-list.png diff --git a/docs/en/Samples/Microservice-Demo.md b/docs/en/Samples/Microservice-Demo.md index d365a477f5..ec890c9013 100644 --- a/docs/en/Samples/Microservice-Demo.md +++ b/docs/en/Samples/Microservice-Demo.md @@ -220,6 +220,7 @@ These pages are not included in the project itself. Instead, AuthServer project * **RabbitMQ** for messaging to other services. * **Redis** for distributed/shared caching. +* **Elasticsearch** for storing logs. ### Backend Admin Application (BackendAdminApp.Host) @@ -316,8 +317,105 @@ Once you refer these client packages, you can directly inject an application ser Since microservices requires authentication & authorization, each remote service call should contain an Authentication header. This header is obtained from the `access_token` inside the current `HttpContext` for the current user. This is automatically done when you use the `Volo.Abp.Http.Client.IdentityModel` package. `BackendAdminAppHostModule` declares dependencies to this package and to the related `AbpHttpClientIdentityModelModule` class. It is integrated to the HTTP Clients explained above. +#### Other Dependencies + +- **Redis** for distributed/shared caching. +- **Elasticsearch** for storing logs. + ### Public Web Site (PublicWebSite.Host) +This is a public web site project that has a web blog and product list page. + +#### Authentication + +PublicWebSite can show blog posts and product list without login. If you login, you can also manage blogs. It redirects to the AuthServer for authentication. Once the user enters a correct username & password, the page is redirected to the public web site application again. Authentication configuration is setup in the `PublicWebSiteHostModule` class: + +```charp +context.Services.AddAuthentication(options => +{ + options.DefaultScheme = "Cookies"; + options.DefaultChallengeScheme = "oidc"; +}) +.AddCookie("Cookies", options => +{ + options.Cookie.Expiration = TimeSpan.FromDays(365); + options.ExpireTimeSpan = TimeSpan.FromDays(365); +}) +.AddOpenIdConnect("oidc", options => +{ + options.Authority = configuration["AuthServer:Authority"]; + options.ClientId = configuration["AuthServer:ClientId"]; + options.ClientSecret = configuration["AuthServer:ClientSecret"]; + options.RequireHttpsMetadata = false; + options.ResponseType = OpenIdConnectResponseType.CodeIdToken; + options.SaveTokens = true; + options.GetClaimsFromUserInfoEndpoint = true; + options.Scope.Add("role"); + options.Scope.Add("email"); + options.Scope.Add("phone"); + options.Scope.Add("PublicWebSiteGateway"); + options.Scope.Add("ProductService"); + options.Scope.Add("BloggingService"); + options.ClaimActions.MapAbpClaimTypes(); +}); +``` + +- It adds "Cookies" authentication as the primary authentication type. +- "oidc" authentication is configured to use the AuthServer application as the authentication server. +- It requires the additional identity scopes *role*, *email* and *phone*. +- It requires the API resource scopes *PublicWebSiteGateway*, *BloggingService* and *ProductService* because it will use these services as APIs. + +IdentityServer client settings are stored inside the `appsettings.json` file: + +```json +"AuthServer": { + "Authority": "http://localhost:64999", + "ClientId": "public-website-client", + "ClientSecret": "1q2w3e*" +} +``` + +#### User Interface + +The PublicWebSite.Host project has a page to list products (`Pages/Products.cshtml`). It also uses the UI from the blogging module. `PublicWebSiteHostModule` adds dependencies to `BloggingWebModule` (*[Volo.Blogging.Web](https://www.nuget.org/packages/Volo.Blogging.Web)* package) for that purpose. + +A screenshot from the Products page: + +![microservice-sample-public-product-list](../images/microservice-sample-public-product-list.png) + +#### Using Microservices + +Publc web site application uses the Blogging and Product microservices for all operations, over the Public Web Site Gateway (PublicWebSiteGateway.Host). + +##### Remote End Point + +`appsettings.json` file contains the `RemoteServices` section to declare the remote service endpoint(s). Each microservice will normally have different endpoints. However, this solution uses the API Gateway pattern to provide a single endpoint for the applications: + +```json +"RemoteServices": { + "Default": { + "BaseUrl": "http://localhost:64897/" + } +} +``` + +`http://localhost:64897/` is the URL of the *PublicWebSiteGateway.Host* project. It knows where are Blogging and Product services are located. + +##### HTTP Clients + +`PublicWebSiteHostModule` class declares dependencies for `BloggingHttpApiClientModule` and `ProductManagementHttpApiClientModule` to be able to use remote HTTP APIs for these services. + +##### Passing the Access Token + +Just like explained in the Backend Admin Application section, Public Web Site project also uses the `AbpHttpClientIdentityModelModule` to pass `access_token` to the calling services for authentication. + +#### Other Dependencies + +- **Redis** for distributed/shared caching. +- **Elasticsearch** for storing logs. + +### Console Client Demo + TODO ## Microservices diff --git a/docs/en/images/microservice-sample-public-product-list.png b/docs/en/images/microservice-sample-public-product-list.png new file mode 100644 index 0000000000000000000000000000000000000000..cf8649bbe576baa75a7f5a1da99183a1c411cec8 GIT binary patch literal 28913 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 dkGI!v;F=FWUs4YV