当自定义基本身份验证提供程序的身份验证失败时,返回自定义HTTP响应代码

时间:2019-11-12 15:12:34

标签: c# servicestack

我知道当使用自定义身份验证提供程序(如以下代码)时,我可以返回自定义响应:

从ServiceStack身份验证中返回自定义身份验证响应对象

我只是想知道是否有一种方法可以返回自定义HTTP响应代码。

例如,当身份验证失败时,我想发送另一个HTTP响应代码,而不是401未经授权的错误,以详细说明失败的原因。例如,当帐户被锁定时,我将发送错误代码XYZ!

public class MyBasicAuthProvider : BasicAuthProvider
{
    public override object Authenticate(ServiceStack.ServiceInterface.IServiceBase authService, IAuthSession session, Auth request)
    {
        //let normal authentication happen
        var authResponse = (AuthResponse)base.Authenticate(authService, session, request);

        //return your own class, but take neccessary data from AuthResponse
        return new
            {
                UserName = authResponse.UserName,
                SessionId = authResponse.SessionId,
                ReferrerUrl = authResponse.ReferrerUrl,
                SessionExpires = DateTime.Now
            };

    }
}

在一个尝试中,我找到了一种在该函数中返回自定义HTTP代码的方法。我返回例如:

return new ServiceStack.HttpError(423, "Locked");

我不确定这是否正确

1 个答案:

答案 0 :(得分:2)

BasicAuthProviderIAuthWithRequest Auth Provider,它启用HTTP Basic Auth,在调用服务时在其中进行验证,即,它不使用对ServiceStack的/auth端点的显式请求进行验证。 / p>

对于失败的基本Auth请求,您想返回带有401 Unauthorized HTTP标头的ServiceStack的WWW-Authenticate状态响应,HTTP客户端必须知道此标头才能提示输入凭据。

我建议您不要使用其他错误响应,但是如果您确实想针对HTTP基本身份验证请求自定义失败响应,则可以在BasicAuthProvideroverride OnFailedAuthentication编写自定义错误响应,想要

public virtual Task OnFailedAuthentication(IAuthSession session, IRequest httpReq, IResponse httpRes)
{
    httpRes.StatusCode = (int)HttpStatusCode.Unauthorized;
    httpRes.AddHeader(HttpHeaders.WwwAuthenticate, "{0} realm=\"{1}\"".Fmt(this.Provider, this.AuthRealm));
    return HostContext.AppHost.HandleShortCircuitedErrors(httpReq, httpRes, httpReq.Dto);
}