【问题标题】:Custom AuthorizeAttribute - Endpoint not work自定义 AuthorizeAttribute - 端点不起作用
【发布时间】:2020-01-13 08:32:16
【问题描述】:

我是 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);

我的 AuthorizeAttribute:


[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);
    }
}

我的端点不再工作。我究竟做错了什么?我没有任何错误。

【问题讨论】:

    标签: c# asp.net-core authorize-attribute asp.net-authorization


    【解决方案1】:

    如果要将您自己的授权逻辑与 IAuthorizationFilter 一起使用,您不应与 AuthorizeAttribute 一起使用,它将使用默认身份验证架构检查身份验证。

    这里参考周涛的回答:Asp.Net Core 2.1 - Authorize based on content in request

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 2017-04-18
      相关资源
      最近更新 更多