5

我有一个在 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);

        }
    }
}
4

1 回答 1

4

在您引用的身份验证和自动化帖子上,它显示为:

ServiceStack 的身份验证、缓存和会话提供程序是全新的、干净的、无依赖关系的可测试 API,不依赖也没有 ASP.NET 现有的成员资格、缓存或会话提供程序模型。

这意味着它是完全独立的,与 ASP.NET 现有的身份验证提供程序无关。即客户端需要对服务进行显式调用以/auth使用 ServiceStack Web 服务进行身份验证。

有关在 MVC 控制器和 ServiceStack Web 服务之间使用和共享 ServiceStack 身份验证提供程序的 MVC 网站示例,请参阅SocialBootstrapApi示例演示项目。

于 2012-08-15T15:51:55.013 回答