编写自定义身份验证+如何检查要发送到哪个端点请求

时间:2019-06-11 06:43:15

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

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

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; }
}

0 个答案:

没有答案