Web方法返回401而不调用成员资格提供者

时间:2017-07-05 15:33:31

标签: 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>
    <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;
    }
    ...
}

但是,当我从Postman调用该方法时,将返回401并且永远不会调用提供程序代码。如果我在ValidateUser方法的开头放置一个断点,它就永远不会被击中。

如果我删除[Authorize]属性,则一切正常。

好像正在使用提供商,但不是我期待的提供商。

相同的代码在其他项目中运行良好。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

我理解Authorize属性的方式是,如果你调用一个没有身份验证的方法,你会得到一个401(与你得到的结果相匹配)

https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api

  

使用[授权]属性

     

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

从我理解的方式来看,您需要首先对用户进行“身份验证”。然后,对于后续调用,Authorize属性将允许授权请求继续。