C# Web方法返回401而不调用成员资格提供程序
我有一个Web Api控制器(部分)如下所示: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
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
属性将允许授权请求继续