.NET Core OAuth IdentityServer4 AllowAnonymous Policy 白名单 .NET 5 IdentityServer4 4.X版本
jwt.io
最小 API 概述
使用 ASP.NET Core 创建最小 Web API
1、Program.cs
using AuthService;
using AuthService.CoreLibrary;
using AuthService.Filters;
using System.Data;
using System.Data.SqlClient;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
string[] address = builder.Configuration["AppSettings:CorsAddress"].Split(',');
string[] port = builder.Configuration["AppSettings:CorsPort"].Split(',');
builder.Services.Configure(builder.Configuration.GetSection("RedisOptions"));
RedisOptions redisOptions = new RedisOptions();
builder.Configuration.Bind("RedisOptions", redisOptions);
string host = redisOptions.Host;
string port = redisOptions.Port;
//加载自定义配置文件
var config = builder.Host.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddJsonFile("CustomConfig.json", optional: true, reloadOnChange: true);
});
//读取 CustomConfig.json 文件 SmtpServer 配置项
var smtp = builder.Configuration["SmtpServer"];
#region 数据库 EF Core
builder.Services.AddDbContext(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
#endregion
#region 数据库 Dapper
string dbType = builder.Configuration["DbSql:DbType"];
switch (dbType)
{
case "SqlServer":
//builder.Services.AddSingleton(builder.Configuration.GetConnectionString("DefaultConnection"));
builder.Services.AddSingleton(builder.Configuration["DbSql:SqlServerConnection"]);
break;
default:
break;
}
builder.Services.AddSingleton();
builder.Services.AddSingleton();
builder.Services.AddSingleton();
builder.Services.AddSingleton();
#endregion
#region
builder.Services.AddIdentityServer(options => { })
.AddDeveloperSigningCredential()
.AddInMemoryClients(AuthService.Security.Clients.GetClients())
.AddInMemoryIdentityResources(AuthService.Security.IdentityConfig.GetIdentityResources())
.AddInMemoryApiResources(AuthService.Security.IdentityConfig.GetResources())
#region ids4 4.X 新特性
.AddInMemoryApiScopes(AuthService.Security.IdentityConfig.GetScopes())
//.AddInMemoryApiScopes(Security.IdentityConfig.ApiScopes)
#endregion
.AddProfileService()
.AddResourceOwnerValidator();
#endregion
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
#region 跨域访问
string AllowSpecificOrigins = "AllowSpecificOrigins";
var urls = StringPlus.GetCors(address, port);
builder.Services.AddCors(options =>
{
options.AddPolicy(AllowSpecificOrigins, builder =>
{
builder.WithOrigins(urls).AllowAnyMethod().AllowAnyHeader().AllowCredentials();
});
});
#endregion
builder.Services.AddControllers(options =>
{
options.Filters.Add(typeof(CustomExceptionFilter));
});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
var summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
app.MapGet("/", () => "Hello World!");
app.MapGet("/api/users/{text}", (string text) => $"{text}");
app.MapGet("/GetData", (IUserRepository userRep) =>
{
return userRep.GetList();
})
.WithName("GetData");
app.MapGet("/api/users/{userId}/books/{bookId}", (int userId, int bookId) => new
{
code = 200,
data = new
{
user = userId,
book = bookId
},
message = ""
});
app.MapGet("/api/weatherforecast", () =>
{
var forecast = Enumerable.Range(1, 5).Select(index => new WeatherForecast
(
DateTime.Now.AddDays(index),
Random.Shared.Next(-20, 55),
summaries[Random.Shared.Next(summaries.Length)]
)).ToArray();
return forecast;
})
.WithName("GetWeatherForecast");
app.UseHttpsRedirection();
app.UseIdentityServer();
app.UseRouting();
app.UseCors(AllowSpecificOrigins);
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
app.Run();
internal record WeatherForecast(DateTime Date, int TemperatureC, string? Summary)
{
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
2、StringPlus.cs
using System.Text;
namespace AuthService.CoreLibrary
{
public class StringPlus
{
public static string[] StringToStrArray(string str)
{
string[] strArray = null;
if (!string.IsNullOrEmpty(str))
{
strArray = str.Split(',');
}
return strArray;
}
public static string[] GetCors(string[] address, string[] port)
{
string[] array = null;
if (address != null && port != null)
{
StringBuilder cors = new StringBuilder();
for (int i = 0; i <= address.Length - 1; i++)
{
for (int j = 0; j <= port.Length - 1; j++)
cors.Append($"{address[i]}:{port[j]},");
}
string url = cors.ToString();
if (!string.IsNullOrEmpty(url))
array = StringToStrArray(url.Substring(0, url.LastIndexOf(",")));
}
return array;
}
}
}
3、RedisOptions.cs
public class RedisOptions
{
public string Host { get; set; }
public string Port { get; set; }
}
*
*
*



