【发布时间】:2013-11-09 00:02:47
【问题描述】:
我有一个使用 ServiceStack 构建的 REST API。我在调用 REST API 时使用 BasicAuthentication 没有任何问题(我正在使用 BasicAuthProvider 注册 AuthFeature)。
现在我正在尝试构建一些 HTML 管理页面。这些也应该经过身份验证。
[Authenticate] 属性重定向到 /login 页面,因此我创建了以下 DTO 和匹配服务来处理登录:
[DefaultView("Login")]
public class SiteLoginService : EnshareServiceBase
{
public object Get(SiteLoginRequest req)
{
return new SiteLoginRequest();
}
public object Post(SiteLoginRequest req)
{
//I am trying to use the registered IAuthProvider, which is the BasicAuthProvider
var authProvider = ResolveService<IAuthProvider>();
authProvider.Authenticate(this, EnshareSession,
new ServiceStack.ServiceInterface.Auth.Auth()
{
Password = req.Password,
UserName = req.UserName
});
return HttpResult.Redirect(req.Redirect);
}
}
[Route("/login")]
public class SiteLoginRequest : IReturn<SiteLoginRequest>
{
public string Redirect { get; set; }
public string Password { get; set; }
public string UserName { get; set; }
}
但是,当我在登录视图页面上填写用户名和密码并将这些信息发布到 SiteLoginService 时,BasicAuthProvider 总是抛出 HttpError: "Invalid BasicAuth credentials"。可能是因为浏览器没有填写Basic auth header,但是我不知道如何通过填写的用户名和密码进行身份验证。
如何针对与现有 REST API 配合使用的 AuthProvider 正确验证站点用户身份?
【问题讨论】:
-
您在注册AuthFeature时是否包含
new BasicAuthProvider()? -
最初我只包含了从 BasicAuthProvider 继承的 CustomAuthProvider。解决方案是还包括 CredentialsAuthProvider - 我在下面发布了自己的答案。
标签: authentication servicestack