init
This commit is contained in:
118
DouyinApi.Extensions/Middlewares/ByPassAuthMiddleware.cs
Normal file
118
DouyinApi.Extensions/Middlewares/ByPassAuthMiddleware.cs
Normal file
@@ -0,0 +1,118 @@
|
||||
using System;
|
||||
using System.Security.Claims;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
|
||||
namespace DouyinApi.Extensions.Middlewares
|
||||
{
|
||||
/// <summary>
|
||||
/// 测试用户,用来通过鉴权
|
||||
/// JWT:?userid=8&rolename=AdminTest
|
||||
/// </summary>
|
||||
public class ByPassAuthMiddleware
|
||||
{
|
||||
private readonly RequestDelegate _next;
|
||||
// 定义变量:当前用户Id,会常驻内存。
|
||||
private string _currentUserId;
|
||||
// 同理定义:当前角色名
|
||||
private string _currentRoleName;
|
||||
public ByPassAuthMiddleware(RequestDelegate next)
|
||||
{
|
||||
_next = next;
|
||||
_currentUserId = null;
|
||||
_currentRoleName = null;
|
||||
}
|
||||
|
||||
|
||||
public async Task Invoke(HttpContext context)
|
||||
{
|
||||
var path = context.Request.Path;
|
||||
// 请求地址,通过Url参数的形式,设置用户id和rolename
|
||||
if (path == "/noauth")
|
||||
{
|
||||
var userid = context.Request.Query["userid"];
|
||||
if (!string.IsNullOrEmpty(userid))
|
||||
{
|
||||
_currentUserId = userid;
|
||||
}
|
||||
|
||||
var rolename = context.Request.Query["rolename"];
|
||||
if (!string.IsNullOrEmpty(rolename))
|
||||
{
|
||||
_currentRoleName = rolename;
|
||||
}
|
||||
|
||||
await SendOkResponse(context, $"User set to {_currentUserId} and Role set to {_currentRoleName}.");
|
||||
}
|
||||
// 重置角色信息
|
||||
else if (path == "/noauth/reset")
|
||||
{
|
||||
_currentUserId = null;
|
||||
_currentRoleName = null;
|
||||
|
||||
await SendOkResponse(context, $"User set to none. Token required for protected endpoints.");
|
||||
}
|
||||
else
|
||||
{
|
||||
var currentUserId = _currentUserId;
|
||||
var currentRoleName = _currentRoleName;
|
||||
|
||||
// 你也可以通过Header的形式。
|
||||
|
||||
//var authHeader = context.Request.Headers["Authorization"];
|
||||
//if (authHeader != StringValues.Empty)
|
||||
//{
|
||||
// var header = authHeader.FirstOrDefault();
|
||||
// if (!string.IsNullOrEmpty(header) && header.StartsWith("User ") && header.Length > "User ".Length)
|
||||
// {
|
||||
// currentUserId = header.Substring("User ".Length);
|
||||
// }
|
||||
//}
|
||||
|
||||
// 如果用户id和rolename都不为空
|
||||
// 可以配置HttpContext.User信息了,也就相当于登录了。
|
||||
if (!string.IsNullOrEmpty(currentUserId) && !string.IsNullOrEmpty(currentRoleName))
|
||||
{
|
||||
var user = new ClaimsIdentity(new[] {
|
||||
// 用户id
|
||||
new Claim("sub", currentUserId),
|
||||
|
||||
// 用户名、角色名
|
||||
new Claim("name", "Test user"),
|
||||
new Claim(ClaimTypes.Name, "Test user"),
|
||||
new Claim("role", currentRoleName),
|
||||
new Claim(ClaimTypes.Role, currentRoleName),
|
||||
|
||||
// 过期时间,两个:jwt/ids4
|
||||
new Claim ("exp",$"{new DateTimeOffset(DateTime.Now.AddDays(10100)).ToUnixTimeSeconds()}"),
|
||||
new Claim(ClaimTypes.Expiration, DateTime.Now.AddDays(1).ToString()),
|
||||
|
||||
// 其他参数
|
||||
new Claim("nonce", Guid.NewGuid().ToString()),
|
||||
new Claim("http://schemas.microsoft.com/identity/claims/identityprovider", "ByPassAuthMiddleware"),
|
||||
new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname","User"),
|
||||
new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname","Microsoft")}
|
||||
, "ByPassAuth");
|
||||
|
||||
context.User = new ClaimsPrincipal(user);
|
||||
}
|
||||
|
||||
await _next.Invoke(context);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 返回相应
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
/// <param name="message"></param>
|
||||
/// <returns></returns>
|
||||
private async Task SendOkResponse(HttpContext context, string message)
|
||||
{
|
||||
context.Response.StatusCode = (int)System.Net.HttpStatusCode.OK;
|
||||
context.Response.ContentType = "text/plain";
|
||||
await context.Response.WriteAsync(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user