Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 基于ASP.NET Core中请求标头中提供的API密钥授权用户_Asp.net Core_Authorization_Asp.net Authorization_Asp.net Core Identity - Fatal编程技术网

Asp.net core 基于ASP.NET Core中请求标头中提供的API密钥授权用户

Asp.net core 基于ASP.NET Core中请求标头中提供的API密钥授权用户,asp.net-core,authorization,asp.net-authorization,asp.net-core-identity,Asp.net Core,Authorization,Asp.net Authorization,Asp.net Core Identity,我正在尝试在ASP.NET Core中重写当前对ASP.NET 4.6的一些授权 我知道授权发生了一些变化,我发现很难在ASP.NET核心中实现我非常简单的授权策略 我的要求: 对服务器的每个请求都应该包含一个名为“key”的头。基于该键的值,我将能够查询数据库并检查该键是表示普通用户还是管理员用户。如果请求不包含有效密钥,则该请求未经授权 我将如何在ASP.NET核心中实现这一点?我发现的每一个例子似乎都完全超出了我的需要 在ASP.NET 4.6中,我在控制器上使用了自己的自定义属性,例如

我正在尝试在ASP.NET Core中重写当前对ASP.NET 4.6的一些授权

我知道授权发生了一些变化,我发现很难在ASP.NET核心中实现我非常简单的授权策略

我的要求:

对服务器的每个请求都应该包含一个名为“key”的头。基于该键的值,我将能够查询数据库并检查该键是表示普通用户还是管理员用户。如果请求不包含有效密钥,则该请求未经授权

我将如何在ASP.NET核心中实现这一点?我发现的每一个例子似乎都完全超出了我的需要

在ASP.NET 4.6中,我在控制器上使用了自己的自定义属性,例如

[User]
public IHttpActionResult DoSomethingOnlyUsersCanDo() {}


我可以在ASP.NET Core中执行同样的操作吗?

在ASP.NET Core中,建议您不要继承Authorized属性。相反,您可以制定自定义授权策略:

您将需要有一个身份验证处理程序,该处理程序基于头为用户创建ClaimsIdentity。然后,您可以制定策略,断言用户是否存在某些声明

您可以在此处找到基本身份验证的实现:。 当然,请注意巴里的评论:

这意味着如何编写身份验证中间件,而不是您将认真考虑使用的东西。

它的核心在中,它继承自
AuthenticationHandler

此实现中的主体是在开发人员创建的事件回调中创建的,在示例中是:

然后,在基于主体调用此回调后,在处理程序中创建身份验证票证:

var ticket = new AuthenticationTicket(validateCredentialsContext.Principal, Scheme.Name);
return AuthenticateResult.Success(ticket);
我还写了一篇关于实现自定义身份验证方案的文章:

if (context.Username == context.Password)
{
    var claims = new[]
    {
        new Claim(ClaimTypes.NameIdentifier, context.Username, ClaimValueTypes.String, context.Options.ClaimsIssuer),
        new Claim(ClaimTypes.Name, context.Username, ClaimValueTypes.String, context.Options.ClaimsIssuer)
    };

    context.Principal = new ClaimsPrincipal(new ClaimsIdentity(claims, context.Scheme.Name));
    context.Success();
}
var ticket = new AuthenticationTicket(validateCredentialsContext.Principal, Scheme.Name);
return AuthenticateResult.Success(ticket);