2017-10-13 123 views
0

我有一個.net核心+角度應用程序,沒有登錄功能。 我不需要登錄,但我想要一個「管理面板」類型的功能。Asp.Net Core + Angular =保護Api而不登錄

例如,我想添加職位到我的網站。

據我所知,我不能使用API​​/addpost/myPassword或任何複雜的字符串只知道我 ,因爲有辦法看到這一點。 如何保護我的api而不實現註冊/登錄功能?

謝謝!

+0

讓我試着通過改述你的問題來理解這一點。您希望能夠保護您的服務端點,因此無法在您的應用程序之外訪問它,但是您不想實現登錄/註冊功能?這是你的意思嗎? – eminlala

+0

是的,我想成爲唯一可以添加帖子的人。我不想僅爲此實現註冊/登錄功能。如果你可以從應用程序之外訪問該服務將會很好(也許我會僱用一個可以添加帖子的主持人......所以我可以給他「鑰匙」來訪問該API,但現在可以不在應用程序之外被接受) – Marian

回答

0

有幾件事你可以做。

您可以做的最簡單的事情是創建一個自定義ActionFilterAttribute,在輸入API控制器方法之前驗證您的服務調用。

我已經在這裏使用了一個Guid的值,但你可以使用任何東西。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public sealed class CustomValidateRequestAttribute : ActionFilterAttribute 
{ 

    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
      var headerValue = actionContext.Request.Headers.FirstOrDefault(item => item.Key == "validation-value").Value?.FirstOrDefault(); 
      Guid guidValidationValue; 

      if (string.IsNullOrWhiteSpace(headerValue) && !Guid.TryParse(headerValue , out guidValidationValue)) 
      { 
       throw new UnauthorizedAccessException(); 
      } 

      base.OnActionExecuting(actionContext); 
     } 
    } 

您將在您的API控制器中將此自定義屬性添加到AddPost方法中。

[HttpPost] 
[CustomValidateRequest] 
public async Task<IHttpActionResult> AddPost...//rest of your code 

在您的客戶端服務中,您必須將此標頭值添加到標頭。喜歡的東西:

addPosts(url, data) { 
    let headers = new Headers(); 
    headers.append('validation-value', 'your-guid-value-or-something-else'); 
    return this.http.post(url, { 
     headers: headers 
    }); 
    } 

對於更復雜的,更安全的選擇,你可以看看如何實現防僞中間件herehere

+1

我爲.net函數使用了ActionExecutingContext(HttpActionContext沒有工作,我使用的是.net核心2.0,可能這就是爲什麼)。在角度服務中,我從本地存儲獲取「密碼」 。您的解決方案幫助了我,謝謝! – Marian