【发布时间】:2019-01-29 11:11:52
【问题描述】:
如何在 ASP.NET Core API 中使用基本身份验证?
我有以下 ASP.NET Web API 控制器。如何使用中间件进行身份验证或任何其他方法来实现 ASP.NET Core Web API 中的基本身份验证?
namespace Test.Web.Controllers
{
[Route("api/[controller]")]
public class TestAPIController : Controller
{
// GET: api/<controller>
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/<controller>/5
[HttpGet("{id}")]
public string Get(int id)
{
return "value";
}
// POST api/<controller>
[HttpPost]
public void Post([FromBody]string value)
{
}
// PUT api/<controller>/5
[HttpPut("{id}")]
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/<controller>/5
[HttpDelete("{id}")]
public void De`enter code here`lete(int id)
{
}
}
}
我看过下面的中间件。如何在控制器中使用中间件?
我需要配置任何其他设置吗?
public class AuthenticationMiddleware
{
private readonly RequestDelegate _next;
public AuthenticationMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
string authHeader = context.Request.Headers["Authorization"];
if (authHeader != null && authHeader.StartsWith("Basic"))
{
// Extract credentials
string encodedUsernamePassword = authHeader.Substring("Basic ".Length).Trim();
Encoding encoding = Encoding.GetEncoding("iso-8859-1");
string usernamePassword = encoding.GetString(Convert.FromBase64String(encodedUsernamePassword));
int seperatorIndex = usernamePassword.IndexOf(':');
var username = usernamePassword.Substring(0, seperatorIndex);
var password = usernamePassword.Substring(seperatorIndex + 1);
if(username == "test" && password == "test" )
{
await _next.Invoke(context);
}
else
{
context.Response.StatusCode = 401; // Unauthorized
return;
}
}
else
{
// No authorization header
context.Response.StatusCode = 401; // Unauthorized
return;
}
}
}
【问题讨论】:
-
你注册你的中间件了吗?另外,为什么不做一个 IAuthenticationFilter 呢?
-
您最好使用内置授权系统和this。像这样编写自己的安全相关代码几乎总是一个坏主意 - 把它留给专家。
标签: c# authentication asp.net-core asp.net-core-webapi