替代基于cookie的会话/身份验证

cra*_*isy 7 authentication session-cookies servicestack

在servicestack中是否有替代会话功能的插件?在某些情况下,我无法使用cookie来匹配我的服务实现中的授权会话.是否有可能使用请求的http标头中的令牌解析会话?如果浏览器阻止cookie,首选解决方案是什么?

Gui*_*Gui 7

我正在使用没有内置身份验证和会话提供程序的ServiceStack.

我使用一个属性作为请求过滤器来收集cookie,请求头或字符串参数的用户信息(id和token).您可以在用户登录后提供此信息.您将新cookie添加到响应中,并在呈现视图时在客户端上注入id和令牌信息,因此您可以使用http标头和查询链接参数.

public class AuthenticationAttribute : Attribute, IHasRequestFilter 
{
    public void RequestFilter(IHttpRequest request, IHttpResponse response, object dto)
    {
        var userAuth = new UserAuth { };
        if(!string.IsNullOrWhiteSpace(request.GetCookieValue("auth"))
        {
            userAuth = (UserAuth)request.GetCookieValue("auth");

        } 
        else if (!string.IsNullOrEmpty(request.Headers.Get("auth-key")) &&
            !string.IsNullOrEmpty(request.Headers.Get("auth-id")))
        {
            userAuth.Id = request.Headers.Get("id");
            userAuth.Token = request.Headers.Get("token");
        }
        authenticationService.Authenticate(userAuth.Id, userAuth.token);
    }
    public IHasRequestFilter Copy()
    {
        return new AuthenticationAttribute();
    }
    public int Priority { get { return -3; } } // negative are executed before global requests 
}
Run Code Online (Sandbox Code Playgroud)

如果用户未获得授权,我会在此时重定向他.

我的项目支持SPA.如果用户使用xmlhttprequests消耗API,则使用标头完成身份验证.我在加载页面时在AngularJS上注入了这些信息,并在所有请求(部分视图,api消费等)上重用它.ServiceStack对于这类内容非常强大,您可以轻松配置AngularJS应用程序和ServiceStack视图引擎并行工作,验证每个请求,全球化您的应用程序等.

如果你没有cookie并且javascript没有调用请求,你可以支持没有cookie的身份验证,如果你总是生成传递id和token作为查询参数的链接,并通过表单上的隐藏输入传递它们,例.