Osm*_*urt 8 asp.net restful-authentication authorize-attribute custom-authentication asp.net-web-api
我打算使用下面的代码来实现我的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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是前端使用
<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>
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我为我的英语感到抱歉.我希望你理解我的问题,我在等你的建议.
Necroreply 对于那些希望制作自定义身份验证属性的人:)
\n\n第一次检查是多余的,因为 HTTP 请求只是 TCP 连接上的一串文本,因此任何人都可以使用 TCP 客户端连接到您的服务器并发送他想要的任何标头。\n actionContext.Request.Headers.GetValues("Host").FirstOrDefault().Contains("localhost:15742"))
\n\n\n授权过滤器在控制器操作之前运行。如果请求未经授权,过滤器将返回错误响应,并且不会调用该操作。
\n
您属性不设置响应的唯一方法是user!=null && !user.TokenIsExpired因此该属性将完成工作并且可以被认为是安全的。
该标题可以删除HttpContext.Current.Response.AddHeader("WWW-Authenticate", "Custom");
另外,如果成功,为什么还要再次发送身份验证令牌?HttpContext.Current.Response.AddHeader("WWW-Authenticate", "Custom " + access_token.FirstOrDefault());
只需减少 IF-s 的嵌套级别,这样代码就会更容易阅读:
\n\n public override void OnAuthorization(HttpActionContext actionContext)\n {\n IEnumerable<string> access_token;\n\n if (!actionContext.Request.Headers.TryGetValues("Authorization", out access_token))\n {\n actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);\n return;\n }\n\n var user = GetUserByToken(access_token);\n\n if (user == null || user.TokenIsExpired)\n {\n actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized); \n return;\n }\n\n // OK\n return;\n }\nRun Code Online (Sandbox Code Playgroud)\n\n很多 ASP.NET 代码似乎都被过度设计了(有时是:),包括 OWIN。但它有一个目的 \xe2\x80\x93 来声明执行各种操作的标准方法,例如 auth。
\n\n想象一下每个人都会开始构建他们的自定义属性,那么就不可能只安装 Google nuget 包并执行类似的操作
\n\npublic void ConfigureAuth(IAppBuilder app)\n{\n app.UseGoogleAuthentication(\n clientId: "000-000.apps.googleusercontent.com",\n clientSecret: "00000000000");\n}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
3540 次 |
| 最近记录: |