![](/img/trans.png)
[英]Use ASP.NET Core WEB API token authentication as a resourceserver with OWIN/Katana OAuth 2.0 Authorization Server
[英]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"))
授權過濾器在控制器操作之前運行。 如果請求未被授權,則過濾器將返回錯誤響應,並且不會調用該操作。
您的屬性未設置“ 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.