c# - 编写自定义身份验证 + 我如何检查到哪个端点请求
问题描述
我想实现自己的身份验证层,但我不确定
a) 这种方法是否可行 - jwt 是否同样安全(验证发行者等除外)?
b) 如何确定被请求的端点是否具有 eg[CustomAuthorize]
属性,表明您必须获得授权才能进入该端点?
我必须使用例如反射来获取路径HomeController
TestMethod
?
示例伪代码:
从 http 头中读取令牌__MyToken
,然后检查字典中是否存在
如果没有,则重定向到/login/
否则添加UserInfo
到HttpContext.Items
当然,稍后我想将 _loggedUsers 移动到其他一些服务,这些服务将通过 AuthMiddleware 的构造函数在这里注入,但现在我只是想了解这个概念
public class AuthMiddleware : IMiddleware
{
private static readonly ConcurrentDictonary<Guid, UserLoginInfo> _loggedUsers = new ConcurrentDictonary<Guid, UserLoginInfo>();
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
Guid? token = context.Request.Headers.First(x => x.Key == "__MyToken")?.Value;
if (EndpointWithAuthorizeAttribute(context.Request.Path) && TokenIsInvalid(token))
{
context.Response.Redirect("/login/");
}
else
{
// in order to access that data in controller, later.
context.Request.HttpContext.Items.Add("UserData", _loggedUsers[token]);
await next(context);
}
}
private bool TokenIsInvalid(Guid token)
{
return
token == null ||
token == Guid.Empty ||
!_loggedUsers.ContainsKey(token) ||
DateTime.Now > _loggedUsers[token].ExpirationTime);
}
}
public class UserLoginInfo
{
pubic Guid Id { get; set; }
pubic DateTime ExpirationTime { get; set; }
}
解决方案
推荐阅读
- react-native - React Native:点击图片打开链接
- r - 如何修复 R 中标准正态分布的变体?
- ruby - 如何修复termux中的Jekyll安装错误?
- python - 将连续数据写入 csv 文件
- python - pandas groupby rank 删除索引,返回全 1
- c++ - 有没有类似 std::emplace_shared 的东西
? - c# - 查询表追加的 BigQuery 配额限制是否适用?
- python - 如何根据 Python 中日期的概率生成随机日期?
- python - Python 请求在尝试下载文件时抛出 Connection Broken: ChunkedEncodingError with http.client.IncompleteRead
- javascript - 从转发的电子邮件中提取电子邮件地址和名称