c# - 自定义 AuthorizeAttribute - 端点不起作用
问题描述
我对 Asp.net Core 很陌生,希望有人能帮助找到问题。我创建了一个自定义Authorize Attribute
来检查存储在工作中的登录数据appsettings.json
(Authorize Attribute
断点命中,数据正确)。但是在检查之后,请求的端点从未命中。
我已经测试了端点是否可以在没有authorization
. 是的,这是工作。
在Startup.cs
我加载我的登录名appsettings.json
并将其作为单例添加到服务中。
LoginModel[] logins = Configuration.GetSection("LoginUsers").Get<LoginModel[]>();
Settings setting = new Settings();
setting.LoginModels = logins;
services.AddSingleton(setting);
我的授权属性:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class MyAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{
public MyAuthorizeAttribute()
{
}
public void OnAuthorization(AuthorizationFilterContext context)
{
// get username and password from header
string authHeader = context.HttpContext.Request.Headers["Authorization"];
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);
var services = context.HttpContext.RequestServices;
var settings = services.GetService<Settings>();
var loginfound = settings.LoginModels.Where(x => x.Username == username && x.Password == password).FirstOrDefault();
if (loginfound == null)
{
context.Result = new StatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
}
}
}
我的控制器:
[Route("api/[controller]")]
[ApiController]
[MyAuthorize]
public class SettingsController : ControllerBase
{
[HttpGet("checkLogin")]
public IActionResult CheckLogin()
{
return Ok(true);
}
}
我的端点不再工作了。我究竟做错了什么?我没有任何错误。
解决方案
对于将您自己的授权逻辑与 IAuthorizationFilter 一起使用,您不应与 AuthorizeAttribute 一起使用,它将使用默认身份验证架构检查身份验证。
在这里参考周涛的回答: Asp.Net Core 2.1 - Authorize based on content in request
推荐阅读
- python-3.x - 从1个集合mongoDB python中的每个文档中打印1个字段的所有值
- logstash - 使用mysql驱动将配置文件添加到logstash后,数据不再发送到elastic
- angular - TSLint 无法识别订阅方法中数组的更新
- login - 在 6.7 中为移动应用配置 OAuth2 令牌的步骤?
- python - 根据 Python 2 中的键将对象添加到字典
- kotlin - 如何从 Kotlin 中的“apply”访问 variable.isInitialized?
- xml - 在 XML 中过度使用 CDATA?
- android - 如何在 Fragment Here Map API 中使用 MapFragment
- java - 复制构造函数是否进行浅拷贝?
- python-3.x - ModuleNotFoundError:没有命名的模块