我正在努力在我的web服务中设置身份验证.

我的所有客户机(WPF应用程序)都应该使用相同的凭据来调用web服务操作.

经过一些研究,我提出了基本的身份验证——在HTTP请求的头中发送用户名和密码.

我找到的大多数资源都是使用OAuth或其他中间件实现身份验证的.但对于我的场景来说,这似乎太大了,使用ASP的身份部分也是如此.净核心.

那么,实现我的目标的正确方法是什么呢?在ASP中使用用户名和密码进行简单的身份验证.NET核心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核心的测试版编写的.希望能有所帮助.

Asp.net相关问答推荐

ASP.NET控制器上的默认接受媒体类型

在每个对象上设置 ClientIDMode = Static 是否有任何缺点(在母版页的 maincontent 上设置)

log4net 记录所有未处理的应用程序错误

Linq 将复杂类型聚合成一个字符串

在哪里可以记录 ASP.NET Core 应用程序的启动/停止/错误事件?

System.Net.Http 版本冲突导致构建警告

跨子域共享 ASP.NET cookie

如何使用文件上传控件 Select 多个文件?

.NET 核心 IdentityUser 模型中规范化邮箱和用户名的用途是什么?

从 IIS 7/8 中的静态内容中删除服务器标头

错误:无法在 Web 服务器上开始调试... ASP.NET 4.0

使用 JObject 所需的库名称是什么?

在asp.net控件之间动态添加

如何在 ASP.Net 的客户端 (JavaScript) 上判断 Page.Validate()?

将查询参数绑定到 ASP.NET Core 中的模型

IIS Express 安装目录在哪里?

global.asax 中的 Application_Error 未捕获 WebAPI 中的错误

简单的 LINQ 和列表错误:WhereListIterator`1[Task]' to type 'System.Collections.Generic.List`1[Task]'

服务器标签格式不正确错误

ASP.NET 核心,更改未经授权的默认重定向