繁体   English   中英

没有OWIN和AspNet.Identity的基于Asp.Net Web Api令牌的授权

[英]Asp.Net Web Api Token Based Authorization WITHOUT OWIN and AspNet.Identity

我正计划将以下代码用于Web api安全性,但是我不确定这是否足够安全且合乎逻辑。 我不想使用OWIN和AspNet.Identity,因为它对我来说非常复杂,我也不完全了解,也不知道如何自定义数据库表,用户角色等。我。

这是CustomAuthorizeAttribute;

public class CustomAuthorize : AuthorizeAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if ((actionContext.Request.Headers.GetValues("Host").FirstOrDefault().Contains("localhost:15742")))
        {
            IEnumerable<string> access_token;
            if (actionContext.Request.Headers.TryGetValues("Authorization", out access_token))
            {
                var user = GetUserByToken(access_token);
                if (user!=null && !user.TokenIsExpired)
                {
                    HttpContext.Current.Response.AddHeader("WWW-Authenticate", "Custom " + access_token.FirstOrDefault());
                    return;
                }
                else
                {
                    actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
                    HttpContext.Current.Response.AddHeader("WWW-Authenticate", "Custom");
                    return;
                }
            }
            else
            {
                actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
            }
        }
        else
        {
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Forbidden);
        }
    }
}

这是前端使用

<script type="text/javascript">
    $(function () {
        var access_token = $.cookie('access_token');
        if (access_token == undefined) {
            $.cookie('access_token', 'test-token');
        }


        $.ajax({
            url: '/api/account',
            headers: { access_token: access_token },
            success: function (data) {
                document.write(data.name + " " + data.lastname);
            }
        });
    });
</script>

顺便说一句,我为我的英语感到抱歉。 希望您理解我的问题,我正在等待您的建议。

对那些希望创建自定义身份验证属性的人进行死灵回复:)

第一次检查是多余的,因为HTTP请求只是TCP连接上的文本字符串,因此任何人都可以使用TCP客户端连接到您的服务器并发送他想要的任何标头。 actionContext.Request.Headers.GetValues("Host").FirstOrDefault().Contains("localhost:15742"))

根据https://docs.microsoft.com/zh-CN/aspnet/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api

授权过滤器在控制器操作之前运行。 如果请求未被授权,则过滤器将返回错误响应,并且不会调用该操作。

您的属性未设置“ Response”的唯一方法是user!=null && !user.TokenIsExpired因此此属性将user!=null && !user.TokenIsExpired ,并且可以认为是安全的。

可以删除此标头HttpContext.Current.Response.AddHeader("WWW-Authenticate", "Custom");

另外,如果成功,为什么还要再次发送身份验证令牌? HttpContext.Current.Response.AddHeader("WWW-Authenticate", "Custom " + access_token.FirstOrDefault());

只需降低IF-s的嵌套级别,即可使代码更易于阅读:

    public override void OnAuthorization(HttpActionContext actionContext)
    {
        IEnumerable<string> access_token;

        if (!actionContext.Request.Headers.TryGetValues("Authorization", out access_token))
        {
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
            return;
        }

        var user = GetUserByToken(access_token);

        if (user == null || user.TokenIsExpired)
        {
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);                
            return;
        }

        // OK
        return;
    }

包括OWIN在内的许多ASP.NET代码似乎都经过了过度设计(有时是:)。 但这有一个目的–声明一种做杂事的标准方法,例如auth。

假设每个人都将开始构建自定义属性,那么就不可能仅安装Google nuget软件包并执行类似的操作

public void ConfigureAuth(IAppBuilder app)
{
     app.UseGoogleAuthentication(
         clientId: "000-000.apps.googleusercontent.com",
         clientSecret: "00000000000");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM