我有一个在 api.mydomain.com 上运行 API 的 ServiceStack 项目。同一解决方案中的管理项目托管在 admin.mydomain.com。登录/注销已由管理应用程序处理,但我想确保用户在我的 api 调用中经过身份验证(有时还要检查权限)。我正在跨项目使用表单身份验证,因此身份验证 cookie 可用于我的 api 项目。
这是我在 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>
基于此Authentication and authorization post,我向服务方法添加了一个 [Authenticate] 属性,期望它根据 IsAuthenticated 的值通过/失败。但是,它每次都重定向到“home/denied”,无论是否存在 auth cookie。(我通过继承 AuthenticateAttribute 并检查 OriginalRequest 确认了这一点......当我使用管理应用程序登录时设置的 cookie 存在并且 req.OriginalRequest.IsAuthenticated 为真。)
为什么我的请求被重定向,以及如何正确利用管理应用程序中设置的现有身份验证凭据?
编辑:这是我想出的解决方案。它只需要一个 IPrincipal 身份来通过身份验证。
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);
}
}
}