我有一个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]
属性,则一切正常。
好像正在使用提供商,但不是我期待的提供商。
相同的代码在其他项目中运行良好。
我错过了什么?
答案 0 :(得分:0)
我理解Authorize
属性的方式是,如果你调用一个没有身份验证的方法,你会得到一个401(与你得到的结果相匹配)
使用[授权]属性
Web API提供了内置的授权过滤器AuthorizeAttribute。此筛选器检查用户是否已通过身份验证。如果不是,则返回HTTP状态代码401(未授权),而不调用该操作。
从我理解的方式来看,您需要首先对用户进行“身份验证”。然后,对于后续调用,Authorize
属性将允许授权请求继续。