根据 ASP.NET 核心请求 header 中提供的 API-key 授权用户
Authorize user based on API-key supplied in request header in ASP.NET Core
我正在尝试重写我目前在 ASP.NET Core 中对 ASP.NET 4.6 的一些授权。
我知道授权有一点变化,我发现很难在 ASP.NET Core 中实现我非常简单的授权策略。
我的要求:
对服务器的每个请求都应包含一个名为 "key" 的 header。根据该键的值,我将能够查询数据库并检查该键是代表普通用户还是管理员用户。如果请求不包含有效密钥,则请求未被授权。
我如何在 ASP.NET Core 中实现它?我发现的每一个例子似乎完全不符合我的需要。
在 ASP.NET 4.6 中,我使用了自己的自定义 AuthorizeAttributes 在我的控制器上使用,例如
[User]
public IHttpActionResult DoSomethingOnlyUsersCanDo() {}
和
[Admin]
public IHttpActionResult DoSomethingOnlyAdminsCanDo() {}
我可以在 ASP.NET Core 中做同样的事情吗?
在ASP.NET核心中,建议您不要继承自AuthorizeAttribute。相反,您可以制定自定义授权策略:https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims.
您需要有一个身份验证处理程序,它可以根据 header 为用户创建 ClaimsIdentity。然后您可以制定政策来断言用户存在某些声明。
您可以在此处找到基本身份验证的实现:https://github.com/blowdart/idunno.Authentication。
当然要注意 Barry 的评论:
It is meant as a demonstration of how to write authentication middleware and not as something you would seriously consider using.
其核心在BasicAuthenticationHandler,继承自AuthenticationHandler<BasicAuthenticationOptions>
。
此实现中的主体是在 developer-made 事件回调中创建的,在示例中是 here:
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);
我还写了一篇关于实现自定义身份验证方案的文章:Creating an authentication scheme in ASP.NET Core 2.0。
我正在尝试重写我目前在 ASP.NET Core 中对 ASP.NET 4.6 的一些授权。
我知道授权有一点变化,我发现很难在 ASP.NET Core 中实现我非常简单的授权策略。
我的要求:
对服务器的每个请求都应包含一个名为 "key" 的 header。根据该键的值,我将能够查询数据库并检查该键是代表普通用户还是管理员用户。如果请求不包含有效密钥,则请求未被授权。
我如何在 ASP.NET Core 中实现它?我发现的每一个例子似乎完全不符合我的需要。
在 ASP.NET 4.6 中,我使用了自己的自定义 AuthorizeAttributes 在我的控制器上使用,例如
[User]
public IHttpActionResult DoSomethingOnlyUsersCanDo() {}
和
[Admin]
public IHttpActionResult DoSomethingOnlyAdminsCanDo() {}
我可以在 ASP.NET Core 中做同样的事情吗?
在ASP.NET核心中,建议您不要继承自AuthorizeAttribute。相反,您可以制定自定义授权策略:https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims.
您需要有一个身份验证处理程序,它可以根据 header 为用户创建 ClaimsIdentity。然后您可以制定政策来断言用户存在某些声明。
您可以在此处找到基本身份验证的实现:https://github.com/blowdart/idunno.Authentication。 当然要注意 Barry 的评论:
It is meant as a demonstration of how to write authentication middleware and not as something you would seriously consider using.
其核心在BasicAuthenticationHandler,继承自AuthenticationHandler<BasicAuthenticationOptions>
。
此实现中的主体是在 developer-made 事件回调中创建的,在示例中是 here:
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);
我还写了一篇关于实现自定义身份验证方案的文章:Creating an authentication scheme in ASP.NET Core 2.0。