7

mythz(ServiceStack dev)によって提案されているように、認証用のグローバルリクエストフィルターがあります。このSO Answer

私のフィルター:

RequestFilters.Add((httpReq, httpResp, requestDto) =>
{
    if (!PublicRoutes.Contains(httpReq.PathInfo))
    {
        new AuthenticateAttribute().Execute(httpReq, httpResp, requestDto);
    }
});

動的ViewPageを継承するServiceStackRazorページをリクエストすると、フィルターが起動しません

例/Default.cshtml:

@inherits ViewPage
<!DOCTYPE html>
<html>
    <head>
        <title>HOME</title>
...
...
ETC

答えの一番下にあるコメントの中で、質問の提起者は同様の行動を示唆していますが、再現方法を正確に説明していないため、解決策を見つけることができません。

解決策はありますか?私は何か間違ったことをしましたか?


アップデート

ページで属性を直接宣言できることを発見しました。

@using ServiceStack.ServiceInterface
@inherits ViewPage

@{
    new AuthenticateAttribute().Execute(Request, Response, this);
}
<!DOCTYPE html>
...
...
ETC

または、ViewPageを継承するクラスを作成し、それらをInitメソッドで実行して、Razorページで新しいクラスを使用できると確信しています。

ただし、これらのソリューションはどちらも無関係で、あまり乾燥していないように見えます。

4

2 に答える 2

1

これを実現するために独自のViewPageクラスを作成し、モデルがページに設定された後にフィルターを呼び出すことになりました。

public abstract class FilterViewPage<TModel> : ViewPage<TModel>
    where TModel : class
{
    public override void SetModel(object o)
    {
        base.SetModel(o);

        this.AppHost.RequestFilters.ForEach(action => action.Invoke(this.Request, this.Response, this.Model));
        this.AppHost.ResponseFilters.ForEach(action => action.Invoke(this.Request, this.Response, this.Model));
    }
}

パーシャルに適用するのではなく、トップレベルのページのみがこれを継承するようにして、フィルターが1回だけ起動するようにします。

于 2013-11-12T01:06:10.087 に答える
0

誰かがログインしているかどうかを単にチェックする以外に、ロールベースのものの多くはリクエストDTOの属性に基づいて処理されます。あなたがしていることのために、いくつかのオプションがあります。1つ目は、何もしない空のdtoを用意することです。

[Route("/")]
[Authenticate]
public class Default { }

public class DefaultService : Service
{
    public object Get(Default req)
    {
         return new object();
    }
}

2つ目は、ユーザーがかみそりのページにログインしているかどうかを簡単に確認する方法です。

@{
    var session = Cache.SessionAs<AuthUserSession>();
    if (!session.IsAuthenticated) throw new HttpException(403, "You are not logged in.");
}
于 2013-02-18T17:20:30.767 に答える