2017-10-13 73 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