C# Web方法返回401而不调用成员资格提供程序

C# Web方法返回401而不调用成员资格提供程序,c#,asp.net-web-api,custom-membershipprovider,C#,Asp.net Web Api,Custom Membershipprovider,我有一个Web Api控制器(部分)如下所示: public class VehicleController : ApiController { [Authorize] public VehicleModel Get(VehicleRequest request) { return VehicleLogic.Get(request); } } 自定义成员资格提供程序的配置如下: <system.web> <members

我有一个Web Api控制器(部分)如下所示:

public class VehicleController : ApiController
{
    [Authorize]
    public VehicleModel Get(VehicleRequest request)
    {
        return VehicleLogic.Get(request);
    }
}
自定义成员资格提供程序的配置如下:

<system.web>
    <membership defaultProvider="CustMembership">
        <providers>
            <clear/>
            <add name="CustMembership"
                type="blah.Auth.CustMembership"
                enablePasswordRetrieval="false"
                enablePasswordReset="false"
                requiresQuestionAndAnswer="false"
                requiresUniqueEmail="false"
                minRequiredPasswordLength="6"
                minRequiredNonalphanumericCharacters="0"
                passwordAttemptWindow="10"
                applicationName="/" />
        </providers>
    </membership>
    ...
</system.web>


public class CustMembership : MembershipProvider
{
    ...
    public override bool ValidateUser(string username, string password)
    {
        using (var context = new Entities())
        {
            var user = context.UserAccounts.SingleOrDefault(x => x.Username == username);
            if (user != null)
            {
                var hash = user.Hash;
                var salt = user.Salt;
                var saltedPassword = $"{salt}{password}{salt}";
                var check = getSha256(saltedPassword);
                if (check == hash)
                {
                    _Name = username;
                    return true;
                }
            }
        }
        return false;
    }
    ...
}

...
公共类CustMembership:MembershipProvider
{
...
公共覆盖bool ValidateUser(字符串用户名、字符串密码)
{
使用(var context=new Entities())
{
var user=context.UserAccounts.SingleOrDefault(x=>x.Username==Username);
如果(用户!=null)
{
var hash=user.hash;
var salt=user.salt;
var saltedPassword=$“{salt}{password}{salt}”;
var check=getSha256(saltedPassword);
如果(检查==散列)
{
_名称=用户名;
返回true;
}
}
}
返回false;
}
...
}
但是,当我从Postman调用该方法时,将返回401,并且从不调用提供程序代码。如果我在
ValidateUser
方法的开始处放置一个断点,它将永远不会被命中

如果我删除
[Authorize]
属性,所有操作都会按照我的预期进行

这就像是在使用一个提供者,但不是我期望的提供者

同样的代码在其他项目中也可以正常工作


我遗漏了什么?

我对
Authorize
属性的理解是,如果您在没有身份验证的情况下调用一个方法,您将得到一个401(与您得到的结果相匹配)

使用[Authorize]属性

Web API提供了一个内置的授权过滤器AuthorizeAttribute。此筛选器检查用户是否经过身份验证。如果不是,则返回HTTP状态代码401(未经授权),而不调用该操作

从我的理解来看,您需要有一种先“验证”用户的方法。然后,对于后续调用,
Authorize
属性将允许授权请求继续