5

api.mydomain.com で API を実行する ServiceStack プロジェクトがあります。同じソリューションの管理プロジェクトは、admin.mydomain.com でホストされています。ログイン/ログアウトはすでに管理アプリケーションによって処理されていますが、API 呼び出しでユーザーが認証されていることを確認したい (場合によってはアクセス許可も確認したい)。プロジェクト全体でフォーム認証を使用しているため、API プロジェクトで認証 Cookie を使用できます。

API プロジェクトの web.config 認証タグは次のとおりです。

<authentication mode="Forms">
  <forms protection="All" loginUrl="home/denied" slidingExpiration="true" timeout="60" defaultUrl="home/denied" path="/" domain="mydomain.com" name=".myAuth"></forms>
</authentication>

この認証と承認の投稿に基づいて、[Authenticate] 属性をサービス メソッドに追加し、IsAuthenticated の値に基づいて成功/失敗することを期待しました。ただし、認証 Cookie が存在するかどうかに関係なく、毎回「home/denied」にリダイレクトされます。(これは、AuthenticateAttribute をサブクラス化し、OriginalRequest を調べることで確認しました...管理アプリを使用してログインしたときに設定された Cookie が存在し、req.OriginalRequest.IsAuthenticated が true です。)

リクエストがリダイレクトされるのはなぜですか? また、管理アプリで設定された既存の認証資格情報を適切に利用するにはどうすればよいですか?

編集:これが私が思いついた解決策です。認証に合格するには、単に IPrincipal ID が必要です。

public class AuthenticateAspNetAttribute : RequestFilterAttribute
{
    public override void Execute(IHttpRequest req, IHttpResponse res, object requestDto)
    {
        SessionFeature.AddSessionIdToRequestFilter(req, res, null); //Required to get req.GetSessionId()

        using (var cache = req.GetCacheClient())
        {
            var sessionId = req.GetSessionId();
            var session = sessionId != null ? cache.GetSession(sessionId) : null;
            var originalRequest = (System.Web.HttpRequest) req.OriginalRequest;
            var identity = originalRequest.RequestContext.HttpContext.User.Identity;
            if (!identity.IsAuthenticated)
                AuthProvider.HandleFailedAuth(new BasicAuthProvider(), session, req, res);

        }
    }
}
4

1 に答える 1

4

あなたが参照している認証と承認の投稿では、次のように書かれています。

ServiceStack の認証、キャッシング、およびセッション プロバイダーは、ASP.NET の既存のメンバーシップ、キャッシング、またはセッション プロバイダー モデルに依存せず、それらを欠いている、完全に新しく、クリーンで、依存関係のないテスト可能な API です。

つまり、完全に分離されており、ASP.NET の既存の認証プロバイダーとは何の関係もありません。つまり、クライアントは/authServiceStack Web サービスで認証するためにサービスを明示的に呼び出す必要があります。

MVC コントローラーと ServiceStack Web サービスの間で ServiceStack の認証プロバイダーを使用および共有する MVC Web サイトの例については、 SocialBootstrapApiサンプル デモ プロジェクトを参照してください。

于 2012-08-15T15:51:55.013 に答える