在异步请求上实现Forms身份验证

时间:2014-07-18 13:49:31

标签: angularjs cookies forms-authentication asp.net-web-api asp.net-web-api2

在具有.net web api后端的角度应用中,我尝试通过异步请求实现表单身份验证。

以下是我的web.config的相关部分......

<authentication mode="Forms">
  <forms loginUrl="/" cookieless="UseCookies" name=".TIMETRACK" requireSSL="false" timeout="30" protection="All" path="/TimeTrack" />
</authentication>

这是我的web api登录方法......

    [Route("Login")]
    public HttpResponseMessage Post(AppUser credentials)
    {
        var userTemplate = _authenticationProvider.GetUserByEmail(credentials.Email);

        var user = Mapper.Map<ClientUser>(credentials);
        if (userTemplate.HashCode == _cryptographyService.HashPassword(credentials.Password, userTemplate.Salt))
        {
            FormsAuthentication.SetAuthCookie(userTemplate.Email, false);
            user.IsAuthenticated = true;
        }
        return Request.CreateResponse(HttpStatusCode.OK, user);
    }

这是我的角度控制器方法进行调用...

    $scope.authenticate = function () {
        if (validateAuthentication()) {
            $http.post('Authentication/Login', { Email: $scope.email, Password: $scope.password })
                .then(loginSuccess, loginFailure);
        }
    };

分析登录后发回的fiddler的响应我可以看到这个......

Set-Cookie: .TIMETRACK=4D69EB09BD2B5B1444FBF07D1AB5EEE86DDEFD237AF451EF38EF6FD78E56E24DBD01369DEC865F81297114FF354BF3BC5C6099C3C5D1D89C001014BE071B4CB5A3059E28DBC7D6B25EE27A6FE2A31E278106D78E8FE080F73A6C8BBD3B6B83F12FAE9CD1AEE80629AA72B1DD16E0606D92D0C74F8388A932930C15D89178F92A; path=/TimeTrack; HttpOnly

所以似乎正在创建cookie。但是,在随后对服务器的请求中......

User.Identity.IsAuthenticated

总是假的。我也没有看到任何cookie被发送回服务器的迹象。

我需要做些什么特别的事情来将身份验证cookie传回服务器吗?

为了它的价值,我已经在GitHub上完成了这个项目。你可以在这看看...... https://github.com/JosephEricDavis/TimeTrack

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

事实证明我错误地在web.config文件中的节点上设置了path属性。删除路径属性后,它开始按预期工作。

对于像我这样不知道cookie路径是什么的人。我发现这个资源很有帮助。

Cookie path and its accessibility to subfolder pages