Asp.Net Core + Angular =无需登录即可保护Api

时间:2017-10-13 14:34:26

标签: .net angular api asp.net-core asp.net-apicontroller

我有一个没有登录功能的.net核心+角度应用程序。 我不需要登录,但我想要一个“管理面板”类型的功能。

例如,我想在我的网站上添加帖子。

我明白我不能使用api / addpost / myPassword或者只有我知道的复杂字符串 因为有办法看到这一点。 如何在不实现注册/登录功能的情况下保护我的api?

谢谢!

1 个答案:

答案 0 :(得分: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