Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Session 自定义会话不使用身份验证_Session_Cookies_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,Session,Cookies,servicestack" /> servicestack,Session,Cookies,servicestack" />

Session 自定义会话不使用身份验证

Session 自定义会话不使用身份验证,session,cookies,servicestack,Session,Cookies,servicestack,我正在尝试设计一个解决方案,其中ServiceStack服务器可以只使用ASP.NET中的身份验证cookie。(实际上,它可以是任何cookie。它只是获取一个会话ID,可以使用后台通道查找详细信息)。自定义身份验证提供程序似乎不是正确的方向,因为它们基于发送的凭据。相反,GlobalRequestFilter对我来说更有意义。在那里,我检查cookie,获取外部会话信息,然后将它们设置为ServiceStack会话并设置为IsAuthenticated。这在请求服务中运行良好,因为它可以访问

我正在尝试设计一个解决方案,其中ServiceStack服务器可以只使用ASP.NET中的身份验证cookie。(实际上,它可以是任何cookie。它只是获取一个会话ID,可以使用后台通道查找详细信息)。自定义身份验证提供程序似乎不是正确的方向,因为它们基于发送的凭据。相反,GlobalRequestFilter对我来说更有意义。在那里,我检查cookie,获取外部会话信息,然后将它们设置为ServiceStack会话并设置为IsAuthenticated。这在请求服务中运行良好,因为它可以访问所需的会话详细信息。到目前为止还不错


问题是,当我决定用Authenticate属性锁定服务时,它显然会在筛选之前运行该属性,因此它总是希望将它们重定向到登录。建议在什么位置添加我的逻辑,以便它在Authenticate属性之前触发并正确验证?

ServiceStack的
[Autenticate]
属性用于,因此您仍然需要使用自定义AuthProvider。有关创建不基于使用凭据的自定义身份验证提供程序的示例,请参阅上一版本说明中的:

通过在AuthProvider中实现
IAuthWithRequest
接口,
[Authenticate]
请求筛选器将调用
PreAuthenticate()
在验证用户是否经过身份验证之前执行任何身份验证。如果用户经过身份验证,您可以在此处填充用户会话,例如:

public class MyAuthProvider : AuthProvider, IAuthWithRequest
{
    public override bool IsAuthorized(IAuthSession session, IAuthTokens tokens, Authenticate request = null)
    {
        return session.IsAuthenticated;
    }

    public override object Authenticate(IServiceBase authService, IAuthSession session, Authenticate request)
    {
        throw new NotImplementedException("Authenticate() should not be called directly");
    }

    public void PreAuthenticate(IRequest req, IResponse res)
    {
        //Do any Auth validation...

        //populate the Session in the Request to Authenticate this user
        req.Items[Keywords.Session] = new AuthUserSession { 
           UserName = ...,
           Email = ...,
           //populate other fields
           IsAuthenticated = true,
        };
    }
}
然后,要注册自定义身份验证提供程序,请将其添加到
AppHost.Configure()
中的
AuthFeature
插件中,例如:

Plugins.Add(new AuthFeature(() => new AuthUserSession(),
  new IAuthProvider[] { 
    new MyAuthProvider (),
  }));

刚刚注意到并从GlobalRequestFilters更改为PreRequestFIlters,但仍然没有帮助。当它看到这个问题时,我仍然在做401。我想我知道了。确定会话是否满足Authenticate属性的实际方法是重写会话的IsAuthorized方法(您必须创建一个强类型的AuthUserSession)并根据提供者的请求返回true<代码>公共覆盖布尔已授权(字符串提供程序){return base.IsAuthorized(提供程序);}谢谢!我仍然需要上面提到的AuthUserSession上的IsAuthorized覆盖,但这就是它的其余部分。