3

デフォルトでは、承認前に何かを呼び出そうとすると、ServiceStack は http ステータス 401 を返します。その代わりに http ステータス 200 と私の DTO を返すにはどうすればよいですか?

理想的には、許可されていないものを呼び出そうとした場合に、ResponseStatus アプリケーション全体でブール型の NeedAuth=true フラグを表示したいと考えています。

4

2 に答える 2

1

401はレスポンスに書き込まれます。これを元に戻す方法は現在ありません。特別な要件がある場合は、組み込みの認証機能を使用しないでください。

必要なことを正確に実行する独自のリクエストフィルターを作成するだけです。これが組み込みのAuthの仕組みであり、単なるリクエストフィルターです。

于 2012-12-13T16:32:34.430 に答える
0

以前に作成したカスタムAuthProviderを変更しました。これで、認証前に何かを呼び出したり、間違った資格情報を提供しようとすると、HTTP200OKステータスと次の応答が返されます。

{
    "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;
}
于 2012-12-15T14:48:51.030 に答える