ASP.NET核心Web API身份验证
我正在努力如何在我的Web服务中设置身份验证。 该服务是使用ASP.NET Core web api构建的。
我所有的客户端(WPF应用程序)都应该使用相同的凭据来调用Web服务操作。
经过一番研究,我想出了基本认证 - 在HTTP请求的头部发送用户名和密码。 但经过数小时的研究,在我看来,基本身份验证并不是ASP.NET Core中的方法。
我发现的大部分资源都是使用OAuth或其他中间件实现身份验证。 但是对于我的场景来说这似乎过大了,并且使用了ASP.NET Core的Identity部分。
那么,实现我的目标的正确方法是什么 - 在ASP.NET Core Web服务中使用用户名和密码进行简单身份验证?
提前致谢!
您可以实现处理基本身份验证的中间件。
public async Task Invoke(HttpContext context)
{
var authHeader = context.Request.Headers.Get("Authorization");
if (authHeader != null && authHeader.StartsWith("basic", StringComparison.OrdinalIgnoreCase))
{
var token = authHeader.Substring("Basic ".Length).Trim();
System.Console.WriteLine(token);
var credentialstring = Encoding.UTF8.GetString(Convert.FromBase64String(token));
var credentials = credentialstring.Split(':');
if(credentials[0] == "admin" && credentials[1] == "admin")
{
var claims = new[] { new Claim("name", credentials[0]), new Claim(ClaimTypes.Role, "Admin") };
var identity = new ClaimsIdentity(claims, "Basic");
context.User = new ClaimsPrincipal(identity);
}
}
else
{
context.Response.StatusCode = 401;
context.Response.Headers.Set("WWW-Authenticate", "Basic realm="dotnetthoughts.net"");
}
await _next(context);
}
此代码是用asp.net核心的测试版编写的。 希望能帮助到你。
现在,当我指出正确的方向后,这是我的完整解决方案:
这是在每个传入请求上执行的中间件类,并检查请求是否具有正确的凭据。 如果没有证书或者它们错误,服务会立即响应401未授权错误。
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;
}
}
}
中间件扩展需要在服务启动类的配置方法中调用
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseMiddleware<AuthenticationMiddleware>();
app.UseMvc();
}
就这样! :)
.Net Core和认证中间件的一个很好的资源可以在这里找到:https://www.exceptionnotfound.net/writing-custom-middleware-in-asp-net-core-1-0/
例如,仅将这个用于特定的控制器:
app.UseWhen(x => (x.Request.Path.StartsWithSegments("/api", StringComparison.OrdinalIgnoreCase)),
builder =>
{
builder.UseMiddleware<AuthenticationMiddleware>();
});
链接地址: http://www.djcxy.com/p/3815.html