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

上一篇: ASP.NET Core Web API Authentication

下一篇: Owin Bearer Token With Windows Authentication