郑勃旭 2 years ago
parent
commit
82af6cbc54
  1. 44
      README.md
  2. 48
      be/Hosts/Auth.Host/src/Win_in.Sfs.Auth.Application/TokenService.cs
  3. 4
      build/src/docker/publish/conf/nginx/nginx.conf

44
README.md

@ -1,42 +1,23 @@
# 开发和部署方式 # 开发和部署方式
## windows x64 下本地开发 ## 开发环境配置
当前项目基于 .net 6 sdk,安装 visual studio 2022 时通常会自带 ### 软件安装
### supervisor 方式开发 1. visual studio 2022(.net 6 sdk)
1. Docker Desktop(wsl2)
1. 根据项目需求,安装 SQL Server 或 MySQL ### 配置文件
2. 使用 build/src/win-x64/publish/ 目录下的 dev.start.cmd 和 dev.stop.cmd 管理非数据库依赖
配置文件 配置文件存储在build\src\docker\publish\conf 目录下,settings 目录存放程序配置文件,其他目录存放依赖配置文件
1. supervisor: `build\src\win-x64\publish\supervisord\supervisor.dev.conf` ### 依赖管理
1. nginx: `build\src\win-x64\publish\nginx\conf\nginx.conf`
1. gateway: `build\src\win-x64\publish\gateway\appsettings.json`
1. config: `build\src\win-x64\publish\gateway\wwwroot\settings\appsettings.json`
1. config: `build\src\win-x64\publish\gateway\wwwroot\settings\appsettings.Development.json`
```mermaid 使用 build/src/docker/publish/ 目录下的 dev.start.cmd 和 dev.stop.cmd 管理依赖的停止启动,可以在Docker Desktop中查看和管理启动的服务
flowchart LR
nginx --localhost:21093--> gateway--localhost:59092--> api:59092
api:59092 --localhost:6379--> redis:6379
api:59092 --localhost:13319--> database:13319
gateway --localhost:8086--> influxdb:8086
```
### Docker Desktop 方式开发
1. 无需按照数据库
2. 使用 build/src/docker/publish/ 目录下的 dev.start.cmd 和 dev.stop.cmd 管理依赖
## 部署 ## 部署
### windows x64 supervisor 方式部署 Docker 和 Windows 部署两种方式只需要按需修改配置文件中的主机名和端口,windows单机部署时使用localhost作为主机名,docker compose单机部署时使用service name 作为主机名
1. 执行: `build\src\win-x64\build.cmd`
2. 上传: `build\dist\win-x64\publish` 目录到服务器
3. 修改配置,执行 publish 目录下的 start.cmd
### docker compose 方式部署 ### docker compose 方式部署
@ -44,7 +25,8 @@ gateway --localhost:8086--> influxdb:8086
2. 上传: `build\dist\win-x64\publish` 目录到服务器 2. 上传: `build\dist\win-x64\publish` 目录到服务器
3. 修改配置,执行 publish 目录下的 start.sh 或 start.cmd 3. 修改配置,执行 publish 目录下的 start.sh 或 start.cmd
构建时的处理: ### windows x64 方式部署
1. 复制并重命名 build\src\win-x64\publish\nginx\conf 到 build\dist\docker\publish\conf\nginx,保持nginx的配置文件统一在 build\src\win-x64\publish\nginx\conf 目录维护 1. 执行: `build\src\win-x64\build.cmd`
1. 复制 build\src\win-x64\publish\gateway 到 build\dist\docker\publish\gateway,保持网关的配置和应用的配置统一在 build\src\win-x64\publish\gateway 目录维护 2. 上传: `build\dist\win-x64\publish` 目录到服务器
3. 修改配置,执行 publish 目录下的 start.cmd

48
be/Hosts/Auth.Host/src/Win_in.Sfs.Auth.Application/TokenService.cs

@ -1,9 +1,10 @@
using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Net.Http; using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks; using System.Threading.Tasks;
using IdentityModel.Client; using IdentityModel.Client;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -11,35 +12,31 @@ using Volo.Abp.Application.Services;
namespace Win_in.Sfs.Auth.Tokens; namespace Win_in.Sfs.Auth.Tokens;
[Route($"api/token")] [Route($"api")]
[Authorize]
public class TokenService : ApplicationService public class TokenService : ApplicationService
{ {
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly IHttpClientFactory _httpClientFactory; private readonly IHttpClientFactory _httpClientFactory;
private readonly ILogger<TokenService> _logger; private readonly ILogger<TokenService> _logger;
private readonly IConfiguration _configuration; private readonly IConfiguration _configuration;
public TokenService(IHttpClientFactory httpClientFactory, IConfiguration configuration, ILogger<TokenService> logger) public TokenService(IHttpContextAccessor httpContextAccessor, IHttpClientFactory httpClientFactory, IConfiguration configuration, ILogger<TokenService> logger)
{ {
this._httpContextAccessor = httpContextAccessor;
this._httpClientFactory = httpClientFactory; this._httpClientFactory = httpClientFactory;
this._configuration = configuration; this._configuration = configuration;
this._logger = logger; this._logger = logger;
} }
[HttpPost] [HttpPost("token")]
[AllowAnonymous] [AllowAnonymous]
public async Task<IActionResult> CreateAsync(LoginModel model) public async Task<IActionResult> CreateAsync(LoginModel model)
{ {
var address = _configuration["AuthServer:Authority"]; var address = _configuration["AuthServer:Authority"];
var request = new DiscoveryDocumentRequest
{
Address = address,
Policy = new DiscoveryPolicy { RequireHttps = false }
};
var discovery = await _httpClientFactory.CreateClient().GetDiscoveryDocumentAsync(request).ConfigureAwait(false);
var clientId = _configuration["AuthServer:ClientId"]; var clientId = _configuration["AuthServer:ClientId"];
var clientSecret = _configuration["AuthServer:ClientSecret"]; var clientSecret = _configuration["AuthServer:ClientSecret"];
this._logger.LogInformation($"address:{address},TokenEndpoint:{discovery.TokenEndpoint},clientId:{clientId},clientSecret:{clientSecret}");
var result = await _httpClientFactory.CreateClient().RequestPasswordTokenAsync(new PasswordTokenRequest var result = await _httpClientFactory.CreateClient().RequestPasswordTokenAsync(new PasswordTokenRequest
{ {
Address = $"{address.TrimEnd('/')}/connect/token", Address = $"{address.TrimEnd('/')}/connect/token",
@ -49,11 +46,6 @@ public class TokenService : ApplicationService
UserName = model.UserName, UserName = model.UserName,
Password = model.Password Password = model.Password
}).ConfigureAwait(false); }).ConfigureAwait(false);
Console.WriteLine($"Result:${(result.IsError ? result.ErrorDescription : result.AccessToken)}");
//if (result.RefreshToken == null)
//{
// throw new UserFriendlyException("用户名或密码错误");
//}
return new JsonResult(new return new JsonResult(new
{ {
@ -72,18 +64,26 @@ public class TokenService : ApplicationService
}); });
} }
[HttpGet("[action]")] [HttpGet("token/application-configuration")]
[AllowAnonymous] public async Task<IActionResult> ApplicationConfiguration()
public string Test()
{ {
return "Test"; var address = _configuration["AuthServer:Authority"];
var url = $"{address.TrimEnd('/')}/api/abp/application-configuration";
var httpClient = _httpClientFactory.CreateClient();
var token = this._httpContextAccessor.HttpContext.Request.Headers.Authorization.ToString();
httpClient.DefaultRequestHeaders.Authorization = AuthenticationHeaderValue.Parse(token);
var response = await httpClient.GetAsync(url).ConfigureAwait(false);
var result = new ContentResult();
result.ContentType = "application/json";
result.Content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
return result;
} }
[HttpGet("/token/test")] [HttpGet("token/test")]
[AllowAnonymous] [AllowAnonymous]
public string Test1() public string Test()
{ {
return "Test"; return "test";
} }
} }

4
build/src/docker/publish/conf/nginx/nginx.conf

@ -59,7 +59,7 @@ http {
index index.html; index index.html;
} }
location ^/api/ { location ~* ^/api/ {
proxy_pass http://proxy; proxy_pass http://proxy;
if ($http_upgrade ~* "close") { if ($http_upgrade ~* "close") {
break; break;
@ -81,7 +81,7 @@ http {
index index.html; index index.html;
} }
location ^/api/ { location ~* ^/api/ {
proxy_pass http://proxy; proxy_pass http://proxy;
if ($http_upgrade ~* "close") { if ($http_upgrade ~* "close") {
break; break;

Loading…
Cancel
Save