ASP.NET WebApi v2 - 使用BasicAuthentication保护

时间:2016-03-30 10:53:57

标签: c# asp.net asp.net-web-api asp.net-web-api2 owin

我正在研究如何保护ASP.NET Web Api应用程序。我开始使用基本身份验证(是的 - 我知道它不推荐,是的 - 我的最终计划是使用基于令牌的身份验证。但我需要先学习和理解基础知识)。

首先,我所做的是创建一个继承自Attribute的{​​{1}},并在我想要保护的控制器上使用。它非常基础(和工作):

AuthorizeAttribute

我在某处读到这种工作方式对于Web Api v1更为常见。并找到了实现基本身份验证的项目:https://github.com/IdentityModel/IdentityModel.Owin.BasicAuthentication

由此我了解到他们正在使用不同的方法(这似乎更正确),我不需要自己的public class SimpleUserNamePasswordAuthorizeAttribute : AuthorizeAttribute { public string UserName { get; set; } public string Password { get; set; } protected override bool IsAuthorized(HttpActionContext actionContext) { string query = actionContext.Request.RequestUri.Query; var nvc = HttpUtility.ParseQueryString(query); string securityQueryToken = nvc["_auth"]; if (string.IsNullOrEmpty(securityQueryToken) && actionContext.Request.Headers.Authorization == null) { return false; } string authToken = ""; if (actionContext.Request.Headers.Authorization != null) authToken = actionContext.Request.Headers.Authorization.Parameter; else authToken = securityQueryToken; if (string.IsNullOrWhiteSpace(authToken)) { return false; } // Decode the token from BASE64 string decodedToken = Encoding.UTF8.GetString(Convert.FromBase64String(authToken)); if(string.IsNullOrWhiteSpace(decodedToken)) { return false; } // Extract username and password from decoded token int index = decodedToken.IndexOf(":", StringComparison.Ordinal); if(index == -1) { return false; } string userName = decodedToken.Substring(0, decodedToken.IndexOf(":", StringComparison.Ordinal)); string password = decodedToken.Substring(decodedToken.IndexOf(":", StringComparison.Ordinal) + 1); return ((userName == UserName) && (password == Password)); } } ,并使用属于ASP的Attribute。 NET。

他们通过继承[Authorize]AuthenticationHandler并将其用作AuthenticationMiddleware中间件来实现这一目标。起初,在我从Owin目录中的WebApiConfig.cs删除了以下内容后,它才开始工作:

App_Start

我还注意到,每次向服务器发出请求时都会调用它,而我自己的属性调用仅发送给使用我的属性的相关控制器。

  1. 我想知道,两种方法之间有什么区别,哪种方式更正确?#34;使用方法?哪个提供更好的安全性?
  2. 为什么我必须从config.SuppressDefaultHostAuthentication(); config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 删除这些行以便它可以正常工作?
  3. 第二种方法是否会对第一种方法没有影响?

1 个答案:

答案 0 :(得分:2)

  

2:为什么我必须从WebApiConfig.cs中删除这些行以便它可以工作?

通过删除这些行,它抑制了主机的默认认证机制(即[Authroize]属性的工作)并启用了自定义过滤器认证机制。

  

1:我想知道,两种方法之间有什么区别,哪种方式更正确?#34;使用方法?哪个提供更好的安全性?

使用Asp.net [Authorize]提供asp.net的默认身份验证功能,但通过继承AuthorizeAttribute,您可以扩展编写自己的功能。虽然两者都为您提供了安全保障,但您可以自行决定哪种方式最适合您。

  

3:第二种方法是否会对第一种方法没有影响?

没有任何技术想法,但它不应该对性能产生影响。