首页 > 解决方案 > 编写自定义身份验证 + 我如何检查到哪个端点请求

问题描述

我想实现自己的身份验证层,但我不确定

a) 这种方法是否可行 - jwt 是否同样安全(验证发行者等除外)?

b) 如何确定被请求的端点是否具有 eg[CustomAuthorize]属性,表明您必须获得授权才能进入该端点?

我必须使用例如反射来获取路径HomeController TestMethod


示例伪代码:

从 http 头中读取令牌__MyToken,然后检查字典中是否存在

如果没有,则重定向到/login/

否则添加UserInfoHttpContext.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; }
}

标签: c#asp.net-coreasp.net-core-mvc

解决方案


推荐阅读