gpt4 book ai didi

基于 Asp.Net Web Api token 的授权,无需 OWIN 和 AspNet.Identity

转载 作者:行者123 更新时间:2023-12-04 08:55:12 24 4
gpt4 key购买 nike

我打算使用下面的代码来保证我的 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>

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

最佳答案

Necroreply 对于那些希望制作自定义身份验证属性的人:)

第一次检查是多余的,因为 HTTP 请求只是 TCP 连接上的一串文本,因此任何人都可以使用 TCP 客户端连接到您的服务器并发送他想要的任何 header 。
actionContext.Request.Headers.GetValues("Host").FirstOrDefault().Contains("localhost:15742"))
根据 https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api

Authorization filters run before the controller action. If the request is not authorized, the filter returns an error response, and the action is not invoked.



您属性未设置响应的唯一方法是 user!=null && !user.TokenIsExpired所以这个属性可以完成工作并且可以被认为是安全的。

可以删除此标题 HttpContext.Current.Response.AddHeader("WWW-Authenticate", "Custom");
另外,如果成功,您为什么要再次发送身份验证 token ? 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;
}

许多 ASP.NET 代码似乎过度设计(有时是 :),包括 OWIN。但它有一个目的——声明一种做各种事情的标准方式,例如 auth。

想象一下每个人都将开始构建他们的自定义属性,然后就不可能只安装 Google nuget 包并执行类似的操作
public void ConfigureAuth(IAppBuilder app)
{
app.UseGoogleAuthentication(
clientId: "000-000.apps.googleusercontent.com",
clientSecret: "00000000000");
}

关于基于 Asp.Net Web Api token 的授权,无需 OWIN 和 AspNet.Identity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31451362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com