新增SwaggerBasicAuthMiddleware中间件,访问api接口的时候可以要求输入用户名和密码
This commit is contained in:
parent
fd89050bbb
commit
e52930e99a
19
Falcon.SugarApi/Swagger/ApplicationBuilderExtend.cs
Normal file
19
Falcon.SugarApi/Swagger/ApplicationBuilderExtend.cs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
using Microsoft.AspNetCore.Builder;
|
||||||
|
|
||||||
|
namespace Falcon.SugarApi.Swagger
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 应用扩展
|
||||||
|
/// </summary>
|
||||||
|
public static class ApplicationBuilderExtend
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 使用基础认证
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="builder"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static IApplicationBuilder UseSwaggerBasicAuth(this IApplicationBuilder builder) {
|
||||||
|
return builder.UseMiddleware<SwaggerBasicAuthMiddleware>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
89
Falcon.SugarApi/Swagger/SwaggerBasicAuthMiddleware.cs
Normal file
89
Falcon.SugarApi/Swagger/SwaggerBasicAuthMiddleware.cs
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Http.Headers;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Falcon.SugarApi.Swagger
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Swagger接口基础认证
|
||||||
|
/// </summary>
|
||||||
|
public class SwaggerBasicAuthMiddleware
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 下一步请求
|
||||||
|
/// </summary>
|
||||||
|
private readonly RequestDelegate Next;
|
||||||
|
/// <summary>
|
||||||
|
/// 配置
|
||||||
|
/// </summary>
|
||||||
|
public SwaggerOptions Options { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构造中间件
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="next">下一步</param>
|
||||||
|
/// <param name="options">配置</param>
|
||||||
|
public SwaggerBasicAuthMiddleware(RequestDelegate next,SwaggerOptions options) {
|
||||||
|
Next = next;
|
||||||
|
this.Options = options;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 执行中间件
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context">HttpContext</param>
|
||||||
|
/// <returns>任务</returns>
|
||||||
|
public virtual async Task InvokeAsync(HttpContext context) {
|
||||||
|
if(!this.Options.UseAuth) {
|
||||||
|
await ToNext(context);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var pf = this.Options.Prefix.StartsWith("/") ? this.Options.Prefix : "/" + this.Options.Prefix;
|
||||||
|
if(!context.Request.Path.StartsWithSegments(pf)) {
|
||||||
|
await ToNext(context);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
string authHeader = context.Request.Headers["Authorization"];
|
||||||
|
if(authHeader == null || !authHeader.StartsWith("Basic ")) {
|
||||||
|
needAuth(context);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var header = AuthenticationHeaderValue.Parse(authHeader);
|
||||||
|
if(header == null || header.Parameter == null) {
|
||||||
|
needAuth(context);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var inBs = Convert.FromBase64String(header.Parameter);
|
||||||
|
var cred = Encoding.UTF8.GetString(inBs).Split(':');
|
||||||
|
var (un, pw) = (cred[0], cred[1]);
|
||||||
|
//var un = cred[0];
|
||||||
|
//var pw = cred[1];
|
||||||
|
if(un == this.Options.AuthName && pw == this.Options.AuthPassword) {
|
||||||
|
await ToNext(context);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
needAuth(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 进入下一个中间件
|
||||||
|
/// </summary>
|
||||||
|
public virtual async Task ToNext(HttpContext context) {
|
||||||
|
await Next.Invoke(context).ConfigureAwait(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 需要认证
|
||||||
|
/// </summary>
|
||||||
|
public virtual void needAuth(HttpContext context) {
|
||||||
|
context.Response.Headers["WWW-Authenticate"] = "Basic";
|
||||||
|
context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
34
Falcon.SugarApi/Swagger/SwaggerOptions.cs
Normal file
34
Falcon.SugarApi/Swagger/SwaggerOptions.cs
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
namespace Falcon.SugarApi.Swagger
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Swagger配置选项
|
||||||
|
/// </summary>
|
||||||
|
public class SwaggerOptions
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 是否启用Swagger
|
||||||
|
/// </summary>
|
||||||
|
public bool Enable { get; set; } = true;
|
||||||
|
/// <summary>
|
||||||
|
/// swagger路由前缀
|
||||||
|
/// </summary>
|
||||||
|
public string Prefix { get; set; } = "";
|
||||||
|
/// <summary>
|
||||||
|
/// 接口网页标题
|
||||||
|
/// </summary>
|
||||||
|
public string DocumentTitle { get; set; } = "ApiService Api接口";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否启用认证
|
||||||
|
/// </summary>
|
||||||
|
public bool UseAuth { get; set; } = false;
|
||||||
|
/// <summary>
|
||||||
|
/// 认证用户名
|
||||||
|
/// </summary>
|
||||||
|
public string? AuthName { get; set; } = "";
|
||||||
|
/// <summary>
|
||||||
|
/// 认证用户密码
|
||||||
|
/// </summary>
|
||||||
|
public string? AuthPassword { get; set; } = "";
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user