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
C# 自定义属性-端点不工作_C#_Asp.net Core_Authorize Attribute_Asp.net Authorization - Fatal编程技术网

C# 自定义属性-端点不工作

C# 自定义属性-端点不工作,c#,asp.net-core,authorize-attribute,asp.net-authorization,C#,Asp.net Core,Authorize Attribute,Asp.net Authorization,我对Asp.net内核很陌生,希望有人能帮我找到问题所在。 我创建了一个自定义的Authorize属性来检查appsettings.json中存储的登录数据 “授权”属性工作断点命中,数据正确。 但是在检查之后,请求的端点从未命中 我已经测试了端点是否在未经授权的情况下工作。是的,这是工作 在Startup.cs中,我从appsettings.json加载我的登录名,并将其作为singleton添加到服务中 LoginModel[] logins = Configuration.GetSecti

我对Asp.net内核很陌生,希望有人能帮我找到问题所在。 我创建了一个自定义的Authorize属性来检查appsettings.json中存储的登录数据 “授权”属性工作断点命中,数据正确。 但是在检查之后,请求的端点从未命中

我已经测试了端点是否在未经授权的情况下工作。是的,这是工作

在Startup.cs中,我从appsettings.json加载我的登录名,并将其作为singleton添加到服务中

LoginModel[] logins = Configuration.GetSection("LoginUsers").Get<LoginModel[]>();
Settings setting = new Settings();
setting.LoginModels = logins;
services.AddSingleton(setting);

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

对于将您自己的授权逻辑与IAAuthorizationFilter一起使用,您不应该与AuthorizationAttribute一起使用,后者将使用默认的身份验证架构检查身份验证

参考陶舟的回答:


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