簡體   English   中英

從Azure WebJob安全地調用WebSite托管的Web API

[英]Securely calling a WebSite hosted Web API from an Azure WebJob

我有一個連續調度的Web作業,它正在監視消息隊列,關閉消息並在對等Web站點上調用Web API來處理消息(在這種情況下使用SignalR向適當的用戶發送通知)。

在這種情況下,安全地調用Web API的最佳方法是什么? 否則,在網站中托管的API顯然是公開的。 也許使用Basic Auth或在配置中存儲安全令牌並將其從作業傳遞到Web API。 或者創建自定義AuthorizeAttribute?

關於從WebJob保護Web API調用的Ant想法將非常感激。 API只能從WebJob中調用。

更新:也許這樣的事情?

首先我宣布這個班級;

public class TokenAuthenticationHeaderValue : AuthenticationHeaderValue
{
    public TokenAuthenticationHeaderValue(string token)
        : base("Token", Convert.ToBase64String(Encoding.UTF8.GetBytes(token)))
    { }
}

然后調用者(WebJob)在發出HTTP請求時使用此類設置auth頭;

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(/* something */);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    client.DefaultRequestHeaders.Authorization = new TokenAuthenticationHeaderValue("TOKEN FROM CONFIG"); 
    // ....

在Web API中,我們檢查請求在auth頭中查找預期的令牌,目前代碼非常難看,但這可以放入自定義屬性中;

public HttpResponseMessage Post([FromBody]TheThing message)
{
    var authenticationHeader = Request.Headers.Authorization;
    var token = Encoding.UTF8.GetString(Convert.FromBase64String(authenticationHeader.Parameter));
    if (authenticationHeader.Scheme != "Token" || token != "TOKEN FROM CONFIG")
    {
        return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "No, no, no. That's naughty!");
    }
    // All OK, carry on.

因此,WebJob通過這種方式調用對等網站上的Web API,並通過傳遞安全保存在Azure配置中的令牌來實現安全性,站點和作業都可以訪問此令牌。

有更好的想法嗎?

聽起來像基本身份驗證對你的場景來說很好。

這里很棒的教程: 基本認證

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM