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);
}
}
}