跨应用程序的表单身份验证的ServiceStack失败了......为什么?

Joh*_*his 5 asp.net-mvc forms-authentication servicestack

我有一个在api.mydomain.com上运行API的ServiceStack项目.同一解决方案中的管理项目托管在admin.mydomain.com.登录/注销已由管理应用程序处理,但我想确保在我的api调用上对用户进行身份验证(有时也检查权限).我正在跨项目使用表单身份验证,因此我的api项目可以使用auth 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>
Run Code Online (Sandbox Code Playgroud)

基于此身份验证和授权帖子,我向服务方法添加了[Authenticate]属性,期望它根据IsAuthenticated的值传递/失败.但是,无论是否存在身份验证cookie,它都会每次重定向到"home/denied".(我通过继承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);

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

myt*_*thz 4

在您引用的身份验证和授权帖子中,内容如下:

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

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

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

  • 我也喜欢这种方法(只需使用一个过滤器来验证 ASP.NET 成员身份验证) - 我会将其添加到 TODO 列表中,以便在 ServiceStack 的未来版本中获得类似的内容:) (2认同)