如何在ServiceStack中更改HTTP 401响应?

时间:2012-12-13 08:42:38

标签: servicestack

默认情况下,当我尝试在授权之前调用任何内容时,ServiceStack会返回http状态401。 如何返回http状态200和我的DTO而不是那个?

理想情况下,我想在ResponseStatus应用程序范围内显示boolean NeedAuth = true标志,如果我尝试调用未经授权的任何内容。

2 个答案:

答案 0 :(得分:1)

401被写入响应,目前没有撤消它的方法。如果您有特殊要求,则不希望使用内置的身份验证功能。

只需创建自己的请求过滤器即可完成您想要的操作,这就是内置Auth的工作方式,它只是一个请求过滤器。

答案 1 :(得分:0)

我修改了之前创建的自定义AuthProvider。 现在,如果我在身份验证之前调用任何内容或尝试提供错误的凭据,我将获得HTTP 200 OK状态和此响应:

{
    "NeedAuth": true
}

我已经扩展了AuthResponse:

public class MyAuthResponse : AuthResponse
{
    public bool? NeedAuth { get; set; }
}

并修改了继承自CredentialsAuthProvider的自定义AuthProvider:

// This one is called when I call anything before authorization
public override void OnFailedAuthentication(IAuthSession session, ServiceStack.ServiceHost.IHttpRequest httpReq, ServiceStack.ServiceHost.IHttpResponse httpRes)
{
    httpRes.StatusCode = (int)HttpStatusCode.OK;
    var callback = httpReq.GetJsonpCallback();
    var doJsonp = EndpointHost.Config.AllowJsonpRequests && !string.IsNullOrEmpty(callback);
    var res = new MyAuthResponse() { NeedAuth = true };
    if (doJsonp)
        httpRes.WriteToResponse(httpReq, res, (callback + "(").ToUtf8Bytes(), ")".ToUtf8Bytes());
    else
        httpRes.WriteToResponse(httpReq, res);
}

// This one is called when I try to login
public override object Authenticate(IServiceBase authService, IAuthSession session, Auth request)
{
    var userName = request.UserName;
    var password = request.Password;
    var res = new MyAuthResponse();

    if (!LoginMatchesSession(session, userName))
    {
        authService.RemoveSession();
        session = authService.GetSession();
    }

    if (TryAuthenticate(authService, userName, password))
    {
        if (session.UserAuthName == null)
            session.UserAuthName = userName;

        OnAuthenticated(authService, session, null, null);

        res.UserName = userName;
        res.SessionId = session.Id;
    }
    else
        res.NeedAuth = true;

    return res;
}