我试图在ServiceStack.net中实现CustomAuthProvider。我需要使用第3个参数扩展用户名/密码。 (我们称之为apikey)我也希望这个接受post / app / json
public override bool TryAuthenticate(ServiceStack.ServiceInterface.IServiceBase authService, string userName, string password)
{
if (String.IsNullOrEmpty(userName) || String.IsNullOrEmpty(password))
return false;
var httpReq = authService.RequestContext.Get<IHttpRequest>();
string apiKey = httpReq.GetParam("apikey");
if (String.IsNullOrEmpty(apiKey))
return false;
var engine = Helpers.DbHelper.GetEngine();
return engine.Account.ValidateApiKey(userName, password, apiKey);
}
我的有效负载看起来像
{
"UserName"="my.user",
"Password"="$thePassword!1",
"Apikey"="theapikey"
}
用户名和密码到达TryAuthenticate(),但apikey始终为null。如果我作为表格发布,上述工作正常。我确定我错过了一些东西,或者对如何做到这一点有完全错误的想法。我是ServiceStack的新手,但在一周的大部分时间里一直在查看示例和文章。 :(任何建议表示赞赏。
注意:我正在使用Advance Rest Client Chrome扩展程序作为我的测试。
答案 0 :(得分:2)
您可以将Apikey参数添加为Querystring(http://localhost:1337/api/auth/credentials?Apikey=theapikey
)的一部分吗?
我相信AuthServce accepts an Auth object所以你的Request的InputStream将被反序列化为Auth对象。这将忽略您的Apikey
参数。我不相信你可以在TryAuthenticat覆盖中重新读取Request的InputStream以取出Apikey
。
如果您将ApiKey添加到查询字符串,则可以在TryAuthenticate覆盖中将其拉出。
var req = authService.RequestContext.Get<IHttpRequest>();
var apiKey = req.QueryString["Apikey"];
您也可以编写自己的服务,接受UserName, Password and ApiKey
的对象。您可以验证Apikey,然后只调用UserName和Password参数调用AuthService。