- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有两个 ServiceStack 服务器 X 和 Y。服务器 X 具有注册和验证用户的功能。它具有 RegistrationFeature、CredentialsAuthProvider、MemoryCacheClient 和 MongoDbAuthRepository 功能来处理身份验证。最近,我引入了服务器 Y 和与服务器 Y 对话的 GUI 表单,以处理我业务领域的另一部分。服务器 Y 需要向服务器 X 上经过身份验证的端点发出请求。
我如何配置服务器 Y,使其在从 GUI 表单收到登录请求时,将该责任传递给有权访问用户信息的服务器 X?
我尝试在服务器 Y 中实现自定义 CredentialsAuthProvider,如下所示:
public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
{
// authenticate through server X
try
{
var client = new JsonServiceClient("http://localhost:8088");
var createRequest = new Authenticate
{
UserName = userName,
Password = password,
provider = Name,
};
var authResponse = client.Post(createRequest);
return true;
}
catch (WebServiceException ex)
{
// "Unauthorized
return false;
}
}
但稍后当我尝试从服务器 Y 中的服务向服务器 X 中经过身份验证的端点发出请求时,出现未授权错误。
public class MyServices2 : Service
{
public object Any(TwoPhase request)
{
try
{
// make a request to server X on an authenticated endpoint
var client = new JsonServiceClient("http://localhost:8088");
var helloRequest = new Hello
{
Name = "user of server Y"
};
var response = client.Post(helloRequest);
return new TwoPhaseResponse { Result = $"Server X says: {response.Result}" };
}
catch (WebServiceException e)
{
Console.WriteLine(e);
throw;
}
}
...
}
最佳答案
这在很大程度上取决于您选择的身份验证方法。如果您想使用 CredentialsAuthProvider
,则必须确保每个服务器都配置为使用相同的 distributed Caching Provider instance (即除 MemoryCacheClient 之外的任何缓存提供程序)。这是因为当您通过身份验证时,Session Cookie Ids指向经过身份验证的用户 session 的内容填充在随每个请求一起发送的服务客户端上。接收 session Cookie ID 的 ServiceStack 实例将使用它来访问已注册缓存提供程序中的经过身份验证的用户 session 。
如果两个 ServiceStack 服务都配置为使用相同的缓存提供程序,您可以将 session Cookie 从传入请求传输到新的服务客户端,如下所示:
public object Any(ClientRequest request)
{
// make a request to server X on an authenticated endpoint
var session = base.SessionAs<AuthUserSession>();
var client = new JsonServiceClient("http://localhost:8088");
client.SetSessionId(session.Id);
var response = client.Post(new Hello {
Name = "user of server Y"
});
return new TwoPhaseResponse { Result = $"Server X says: {response.Result}" };
}
否则,如果您将 HTTP Basic Auth 与 BasicAuthProvider
一起使用,则用户名/密码将随请求一起发送,您可以通过以下方式将其传输到您的内部服务客户端:
var basicAuth = base.Request.GetBasicAuthUserAndPassword();
client.UserName = basicAuth.Value.Key;
client.Password = basicAuth.Value.Value;
client.AlwaysSendBasicAuthHeader = true;
这将复制在传入请求中发送的用户名/密码,并将其与传出请求一起发送。但要使其正常工作,必须将两个 ServiceStack 实例配置为使用相同的 BasicAuthProvider
和 User Auth Repository因为下游服务器需要能够验证提供的用户名/密码。
同样,您可以使用 API Key AuthProvider做类似的事情,而不是转发用户名/密码,你可以转发一个 API key :
var apikey = base.Request.GetApiKey();
client.BearerToken = apikey.Id;
同样,这需要使用相同的 ApiKeyAuthProvider
和 User Auth Repository 配置,因为下游服务器需要验证提供的 API key 。
否则,如果您不希望每个服务器共享相同的基础架构依赖项(例如缓存提供程序/用户身份验证存储库),我会考虑使用 JWT Auth Provider这非常适合使用 one ServiceStack Instance that issues the the JWT Token 进行身份验证的场景封装用户 session 并允许您向其他 ServiceStack 实例发出经过身份验证的请求 just need to have a JwtAuthProviderReader registered .
要转移 JWT token ,您可以通过以下方式访问它:
var bearerToken = base.Request.GetBearerToken()
?? base.Request.GetCookieValue(Keywords.TokenCookie);
并将其填充到内部服务客户端:
client.BearerToken = bearerToken;
关于c# - ServiceStack 中的直通身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43344432/
在 JSF2 应用程序中遇到验证属性的问题时,有两种主要方法。 使用 Annotation 在 ManagedBean 上定义验证 @ManagedBean public class MyBean {
我想实现一个不常见的功能,我认为 jquery 验证插件将是最好的方法(如果您在没有插件的情况下建议和回答,我们也会欢迎)。我想在用户在输入字段中输入正确的单词后立即隐藏表单。我试过这个: $("
我有几个下拉菜单(类名为month_dropdown),并且下拉菜单的数量不是恒定的。我怎样才能为它们实现 NotEqual 验证。我正在使用 jQuery 验证插件。 这就是我写的 - jQuery
我设法制作了这个网址验证代码并且它起作用了。但我面临着一个问题。我认为 stackoverflow 是获得解决方案的最佳场所。 function url_followers(){ var url=do
我目前正在使用后端服务,该服务允许用户在客户端应用程序上使用 Google Games 库登录。 用户可以通过他们的 gplay ID 向我们发送信息,以便登录或恢复旧帐户。用户向我们发送以下内容,包
我正在尝试验证输入以查看它是否是有效的 IP 地址(可能是部分地址)。 可接受的输入:172、172.112、172.112.113、172.112.113.114 Not Acceptable 输入
我从 Mongoose 验证中得到这条消息: 'Validator failed for path phone with value ``' 这不应该发生,因为不需要电话。 这是我的模型架构: var
我一直在尝试使用Python-LDAP (版本 2.4.19)在 MacOS X 10.9.5 和 Python 2.7.9 下 我想在调用 .start_tls_s() 后验证与给定 LDAP 服务
我正在处理一个仅与 IE6 兼容的旧 javascript 项目(抱歉...),我想仅在 VS 2017 中禁用此项目的 ESLint/CSLint/Javascript 验证/CSS 验证。 我知道
我正在寻找一种方法来验证 Spring 命令 bean 中的 java.lang.Double 字段的最大值和最小值(一个值必须位于给定的值范围之间),例如, public final class W
我正在尝试在 springfuse(JavaEE 6 + Spring Framework (针对 Jetty、Tomcat、JBoss 等)) 和 maven 的帮助下构建我的 webapps 工作
我试图在我们的项目中使用 scalaz 验证,但遇到了以下情况: def rate(username: String, params: Map[String, String]): Validation
我有一个像这样的 Yaml 文件 name: hhh_aaa_bbb arguments: - !argument name: inputsss des
我有一个表单,人们可以单击并向表单添加字段,并且我需要让它在单击时验证这些字段中的值。 假设我单击它两次并获取 2 个独立的字段集,我需要旋转 % 以确保它在保存时等于 100。 我已放入此函数以使其
在我的页面中有一个选项可以创建新的日期字段输入框。用户可以根据需要创建尽可能多的“截止日期”和“起始日期”框。就像, 日期_to1 || date_from1 日期到2 ||日期_from2 date
我有一个像这样的 Yaml 文件 name: hhh_aaa_bbb arguments: - !argument name: inputsss des
有没有办法在动态字段上使用 jquery 验证表单。 我想将其设置为必填字段 我正在使用 Jsp 动态创建表单字段。 喜欢 等等...... 我想使用必需的表单字段验证此表单字段。 最佳答
嗨,任何人都可以通过提供 JavaScript 代码来帮助我验证用户名文本框不应包含数字,它只能包含一个字符。 最佳答案 使用正则表达式: (\d)+ 如果找到匹配项,则字符串中就有一个数字。 关于J
我有两个输入字段holidayDate和Description(id=tags) $(document).ready(function() {
我遇到了这个问题,这些验证从电子邮件验证部分开始就停止工作。 我只是不明白为什么即使经过几天的观察,只是想知道是否有人可以在这里指出我的错误? Javascript部分: function valid
我是一名优秀的程序员,十分优秀!