没有 OWIN 和 AspNet.Identity 的基于 Asp.Net Web Api 令牌的授权
Posted
技术标签:
【中文标题】没有 OWIN 和 AspNet.Identity 的基于 Asp.Net Web Api 令牌的授权【英文标题】:Asp.Net Web Api Token Based Authorization WITHOUT OWIN and AspNet.Identity 【发布时间】:2015-10-05 17:32:34 【问题描述】:我计划使用下面的代码来确保我的 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>
顺便说一句,我为我的英语感到抱歉。我希望你能理解我的问题,我正在等待你的建议。
【问题讨论】:
您的问题是什么?您是否设法获得了 ClientID ?访问令牌? 是的,那也是我的兄弟@Jacks 先生 【参考方案1】:为那些希望制作自定义身份验证属性的人提供 Necroreply :)
第一次检查是多余的,因为 HTTP 请求只是 TCP 连接上的一串文本,因此任何人都可以使用 TCP 客户端连接到您的服务器并发送他想要的任何标头。
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
授权过滤器在控制器操作之前运行。如果请求未被授权,则过滤器返回错误响应,并且不会调用该操作。
你属性不设置响应的唯一方法是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;
很多 ASP.NET 代码似乎过度设计(有时是 :),包括 OWIN。但它有一个目的——声明做各种事情的标准方式,例如身份验证。
假设每个人都将开始构建他们的自定义属性,那么就不可能只安装 Google nuget 包并执行类似的操作
public void ConfigureAuth(IAppBuilder app)
app.UseGoogleAuthentication(
clientId: "000-000.apps.googleusercontent.com",
clientSecret: "00000000000");
【讨论】:
以上是关于没有 OWIN 和 AspNet.Identity 的基于 Asp.Net Web Api 令牌的授权的主要内容,如果未能解决你的问题,请参考以下文章
从Microsoft.AspNet.Identity看微软推荐的一种MVC的分层架构
AspNet.Identity 自定义用户和自定义角色应该很简单;我错过了啥?