可以绕过 servicestack 的非标准身份验证机制
Possible to bypass servicestack's authentication mechanisms for non standard authentication
我的身份验证机制在某种程度上有所不同,它无法适应 ServiceStack 当前的一种身份验证方法(即使覆盖方法 'TryAuthenticate' 也无法提供解决方案)。那么是否可以从任意 ServiceStack 服务进行身份验证?
举个例子:
- 我打开一个普通的旧 HTML 登录页面(我正在使用 Angular 作为记录)。
- 我登录并调用我的自定义 ServiceStack 服务,以便将非标准凭据发送到服务器(当然使用 Angular 的 http 指令)。
- 我自己验证凭据。如果正确的话,我喜欢连接到 servicestack 身份验证机制,并且可能必须将 ServiceStack 身份验证 cookie 发送回浏览器。我对么?
如果有人可以完成 3 个工作,我可以调用具有 authenticate 属性的 ServiceStack 服务
要允许通过[Authenticate]
属性,需要any one of the registered AuthProvidersIsAuthorized()
到returntrue
,即:
public class CustomAuthProvider : AuthProvider
{
public CustomAuthProvider()
{
this.Provider = "custom";
}
public override bool IsAuthorized(
IAuthSession session, IAuthTokens tokens, Authenticate request=null)
{
return true; //custom logic to verify if this session is authenticated
}
public override object Authenticate(
IServiceBase authService, IAuthSession session, Authenticate request)
{
throw new NotImplementedException();
}
}
Plugins.Add(new AuthFeature(() => new CustomUserSession(),
new IAuthProvider[] {
new CustomAuthProvider()
}));
在您的自定义身份验证服务中,您还应该使用 IsAuthenticated=true
保存用户会话,例如:
public object Any(CustomAuth request)
{
//Authenticate User
var session = base.SessionAs<CustomUserSession>();
session.IsAuthenticated = true;
this.SaveSession(session);
}
我的身份验证机制在某种程度上有所不同,它无法适应 ServiceStack 当前的一种身份验证方法(即使覆盖方法 'TryAuthenticate' 也无法提供解决方案)。那么是否可以从任意 ServiceStack 服务进行身份验证?
举个例子:
- 我打开一个普通的旧 HTML 登录页面(我正在使用 Angular 作为记录)。
- 我登录并调用我的自定义 ServiceStack 服务,以便将非标准凭据发送到服务器(当然使用 Angular 的 http 指令)。
- 我自己验证凭据。如果正确的话,我喜欢连接到 servicestack 身份验证机制,并且可能必须将 ServiceStack 身份验证 cookie 发送回浏览器。我对么?
如果有人可以完成 3 个工作,我可以调用具有 authenticate 属性的 ServiceStack 服务
要允许通过[Authenticate]
属性,需要any one of the registered AuthProvidersIsAuthorized()
到returntrue
,即:
public class CustomAuthProvider : AuthProvider
{
public CustomAuthProvider()
{
this.Provider = "custom";
}
public override bool IsAuthorized(
IAuthSession session, IAuthTokens tokens, Authenticate request=null)
{
return true; //custom logic to verify if this session is authenticated
}
public override object Authenticate(
IServiceBase authService, IAuthSession session, Authenticate request)
{
throw new NotImplementedException();
}
}
Plugins.Add(new AuthFeature(() => new CustomUserSession(),
new IAuthProvider[] {
new CustomAuthProvider()
}));
在您的自定义身份验证服务中,您还应该使用 IsAuthenticated=true
保存用户会话,例如:
public object Any(CustomAuth request)
{
//Authenticate User
var session = base.SessionAs<CustomUserSession>();
session.IsAuthenticated = true;
this.SaveSession(session);
}