当前位置: 首页 > 知识库问答 >
问题:

ASP的自定义承载令牌授权。网芯

万俟嘉珍
2023-03-14

这是自定义承载令牌授权机制的可接受实现吗?

授权属性

public class AuthorizeAttribute : TypeFilterAttribute
{
    public AuthorizeAttribute(): base(typeof(AuthorizeActionFilter)){}
}

public class AuthorizeActionFilter : IAsyncActionFilter
{
    private readonly IValidateBearerToken _authToken;
    public AuthorizeActionFilter(IValidateBearerToken authToken)
    {
        _authToken = authToken;
    }

    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        const string AUTHKEY = "authorization";
        var headers = context.HttpContext.Request.Headers;
        if (headers.ContainsKey(AUTHKEY))
        {
            bool isAuthorized = _authToken.Validate(headers[AUTHKEY]);
            if (!isAuthorized)
                context.Result = new UnauthorizedResult();
            else
                await next();
        }
        else
            context.Result = new UnauthorizedResult();
    }
}

验证服务。APISettings类用于appSettings,但验证可以扩展为使用数据库。。。显然:)

public class APISettings
{
    public string Key { get; set; }
}

public class ValidateBearerToken : IValidateBearerToken
{
    private readonly APISettings _bearer;

    public ValidateBearerToken(IOptions<APISettings> bearer)
    {
        _bearer = bearer.Value;
    }

    public bool Validate(string bearer)
    {
        return (bearer.Equals($"Bearer {_bearer.Key}"));
    }
}

实施

[Produces("application/json")]
[Route("api/my")]
[Authorize]
public class MyController : Controller

应用设置

"APISettings": {
"Key": "372F78BC6B66F3CEAF705FE57A91F369A5BE956692A4DA7DE16CAD71113CF046"

}

请求头

Authorization: Bearer 372F78BC6B66F3CEAF705FE57A91F369A5BE956692A4DA7DE16CAD71113CF046

共有1个答案

乌鸿宝
2023-03-14

这是可行的,但这有点像是重新发明轮子。

我认为现在最好的方法是使用JWTs,你可以在这里找到更多关于它的信息:http://www.jwt.io/

它的一些优点是与asp很好地集成。net内核,您还可以向令牌添加一些信息(用户名、角色等)。这样,你甚至不需要访问数据库进行验证(如果你想的话)。

此外,在应用程序设置文件中存储密钥可能会意外地将它们添加到源代码管理器(安全性)中。您可以将用户机密用于本地开发(或者在环境=dev时禁用密钥)和环境变量用于生产。

下面是一个很好的例子,说明如何将jwt与asp.net一起使用:https://jonhilton.net/2017/10/11/secure-your-asp.net-core-2.0-api-part-1-issuing-a-jwt/

 类似资料:
  • 经过大量阅读,我找到了一种实现自定义JWT承载令牌验证器的方法,如下所示。 : 自定义验证器类: 如果令牌被盗,我想添加一个额外的安全层来验证请求是否来自生成令牌的同一个客户端。 问题: 是否有任何方法可以访问类中的,以便根据当前客户端/请求者添加自定义验证 我们是否有其他方法可以使用这种方法/中间件验证请求者的真实性

  • 当一个人试图使用azure AD承载令牌访问我们的系统时,这个获取和缓存资源令牌的工作流程是不存在的。 所以我的问题是,我如何使用承载令牌来启用它?如何才能像使用OpenIDConnect一样请求额外的资源令牌?是否可以使用ADAL从承载令牌获取授权代码?

  • 我已经编写了一个云函数,该函数接收一个Base64字符串并将其传递到Google Cloud Vision API中,我还在客户端上编写了一个函数,该函数通过HTTP调用Firebase云函数。 虽然数据可以很好地从客户端传递到云功能,但服务器对Google Vision API的请求不起作用。我得到一个状态码错误。 我很确定这与授权承载令牌有关,因为在shell中使用环境变量运行它就可以了。顺便

  • 我目前正在构建一个web应用程序,其后端完全构建在API Gateway/lambda中。我构建了一个自定义的JSON Web令牌(JWT)授权器来授权用户。目前我正在头字段中传递令牌。 不幸的是,我只能定义一个头字段,将令牌发送到API网关。我的应用程序将令牌存储在一个cookie中。 有什么办法吗?谢谢!

  • 我将授权:承载{令牌}作为HTTP请求传递给我的SymfonyRest控制器。 我的请求: 在我的控制器内: 由于某种原因,当我使用Symfony的请求方法时,授权标头对我的控制器不可用。当我使用PHP的getallheaders()时,授权头将按预期显示。你知道为什么Symfony没有看到吗? 谢谢