我想实现自己的身份验证层,但是我不确定
a)这种方法是否可行-是否对jwt同样安全(除了验证发行者等)?
b)如何确定所请求的端点是否具有例如[CustomAuthorize]
属性,该属性指示您已被授权才能进入该端点?
我必须使用反射来获取HomeController
TestMethod
的路径吗?
示例伪代码:
从__MyToken
HTTP标头中读取令牌,然后检查字典中是否存在
如果没有,则重定向到/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; }
}