デフォルトでは、承認前に何かを呼び出そうとすると、ServiceStack は http ステータス 401 を返します。その代わりに http ステータス 200 と私の DTO を返すにはどうすればよいですか?
理想的には、許可されていないものを呼び出そうとした場合に、ResponseStatus アプリケーション全体でブール型の NeedAuth=true フラグを表示したいと考えています。
デフォルトでは、承認前に何かを呼び出そうとすると、ServiceStack は http ステータス 401 を返します。その代わりに http ステータス 200 と私の DTO を返すにはどうすればよいですか?
理想的には、許可されていないものを呼び出そうとした場合に、ResponseStatus アプリケーション全体でブール型の NeedAuth=true フラグを表示したいと考えています。
401はレスポンスに書き込まれます。これを元に戻す方法は現在ありません。特別な要件がある場合は、組み込みの認証機能を使用しないでください。
必要なことを正確に実行する独自のリクエストフィルターを作成するだけです。これが組み込みのAuthの仕組みであり、単なるリクエストフィルターです。
以前に作成したカスタム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;
}