任何人都可以指向使用NT凭据主动发出RequestSecurityToken的示例代码 Thread.CurrentPrincipal as ClaimsPrincipal
吗?
该场景是一个启用了Windows身份验证的asp.net Web应用程序(因此有一个经过身份验证的WindowsIdentity).我的愿望是主动调用STS而不是启用passiveRedirect,并使用.Net 4.5身份库执行此操作.
大多数代码示例(例如,用于Windows Phone的Claims Helper或使用Active STS)使用username/pwd输入和UserNameWSTrustBinding设置凭据.
我认为解决方案可能涉及模拟或使用channelFactory.CreateChannelWithActAsToken()
从Windows标识创建的令牌调用.
- 当访问/ adfs/services/trust/13/windowsmixed端点时,以下.Net4.5代码确实获得了GenericXmlSecurityToken.但是,声明适用于运行站点的域帐户,而不是经过身份验证的用户的域帐户.当我将端点切换到/ adfs/services/trust/13/kerberossmixed时,我得到了"无法协商"的错误,如几个问题和论坛中所述,但我不能在.Net 4.5中应用任何提供的解决方案.其中一个未从Microsoft.IdentityModel移植过的类是KerberosWSTrustBinding ...
public static void CallSts()
{
try
{
var wsMod = FederatedAuthentication.WSFederationAuthenticationModule;
var appliesToEp = new EndpointReference(wsMod.Realm);
var stsEp = new EndpointAddress(new Uri(wsMod.Issuer), EndpointIdentity.CreateSpnIdentity("stsSpn"));
var msgBinding = new WS2007HttpBinding(SecurityMode.TransportWithMessageCredential, false);
msgBinding.Security.Message.EstablishSecurityContext = false;
msgBinding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
using(var factory = new WSTrustChannelFactory(msgBinding, stsEp))
{
factory.Credentials.SupportInteractive = false;
factory.TrustVersion = TrustVersion.WSTrust13;
var myRst = new RequestSecurityToken
{
RequestType …
Run Code Online (Sandbox Code Playgroud) 在web api团队创建的OData示例之后,我的控制器具有以下支持补丁:
public HttpResponseMessage Patch([FromODataUri] int key, Delta<Foo> item)
{
var dbVersion = myDb.GetById(key);
if(dbVersion == null)
throw Request.EntityNotFound();
item.Patch(dbVersion);
myDb.Update(dbVersion);
return Request.CreateResponse(HttpStatusCode.NoContent);
}
Run Code Online (Sandbox Code Playgroud)
并使用自动生成的客户端(派生自DataServiceContext
),我提交了这样的补丁请求:
var foo = svcContainer.Foos.Where (f => f.Id == 1).SingleOrDefault();
foo.Description = "Updated Description";
svcContainer.UpdateObject(foo);
svcContainer.SaveChanges(SaveChangesOptions.PatchOnUpdate);
Run Code Online (Sandbox Code Playgroud)
但是,在fiddler中跟踪调用,我看到Foo的所有其他属性都被序列化并发送到服务.这是正确的行为吗?我希望只通过网络发送ID和描述.另外,如果我调试服务方法并调用
GetChangedPropertyNames
在item上,返回其所有属性名称.
我应该在客户端上创建某种Delta实例吗?
我理解服务的断开性质,因此服务端没有用于跟踪更改的上下文,但在我看来,api团队为某个原因添加了对补丁的支持,所以我想知道客户端是否应该以不同的方式调用更新.
YiDing提供的链接解释了如何从客户端创建一个真正的PATCH请求(使用Microsoft.OData.Client.DataServiceContext
由Microsoft.OData.Client 6.2.0
上面和上面创建的.为方便起见,这里是代码片段:
var svcContainer = new Default.Container(<svcUri>);
var changeTracker = new DataServiceCollection<Foo>(svcContainer.Foos.Where(f => f.Id == 1));
changeTracker[0].Description = "Patched Description";
svcContainer.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
该DataServiceCollection
工具财物跟踪,并使用这种模式,只有更新的属性发送到服务.不使用DataServiceCollection
和简单使用
svcContainer.UpdateObject(foo); …
Run Code Online (Sandbox Code Playgroud) 我观察到,如果我刷新或重新加载LINQPad指定的插件目录中的dll,我必须关闭并重新打开当前脚本以使库更改生效 - 这当然是有道理的.我的问题是,如果有一个命令或密钥专门执行此重新加载而不关闭脚本窗口?
使用System.ServiceModel库进行路由,我有一个REST服务,其中包含一个简单的模板
"{} SEARCHTERM?选择= {} someSearchOpt
所以电话会是这样的:
搜索短语"河流探险队"没有选项.
这只是接受搜索短语并返回结果.它工作得很好.但是,如果搜索包含文字&符号的短语,例如"Lewis&Clark",我尝试了明显的url编码&符号
刘易斯%26Clark
但即便如此,请求永远不会被路由,但服务器会立即返回400 Bad Request.很明显,它被解释为查询字符串分隔符,并使请求无效,因为此特定模板需要一个url参数并且没有前面的"?" 分隔符.
由于这些搜索短语可能具有其他受限制的字符,因此预期它们由客户端编码的url,并且当它们被成功路由时,REST api调用参数上的HttpUtility.UrlDecode.所以我的问题是,如果有一些技术可以将url编码的&符号正确路由为rest url参数而不是作为查询字符串分隔符进行预先解释和拒绝?
更新:对于记录,如果搜索词期望作为查询字符串参数(不是url参数),则发送Lewis%26Clark可以正常工作.例如
http://myhost.contoso.com/searchapi?searchTerm=lewis%26clark
因此,为了澄清,我希望在REST模板中使用url参数时获得相同的结果.
我们有一个企业LOB应用程序,用于使用SQLServer(2008)管理数百万个书目(大量文本)记录.数据库非常规范化(完整记录可能很容易由十个连接表加上嵌套集合组成).写交易很好,我们现在有一个非常敏感的搜索解决方案,它慷慨地使用全文索引和索引视图.
问题是,在现实中,许多内容研究用户需要,可以更好地提供服务的只读仓储式拷贝数据,但它需要近乎实时地连续复制(几分钟的等待时间是精细).
我们的搜索已经通过几个计算列或复合表进行了优化,我们希望添加更多.索引视图由于其约束(例如没有外部联接)而无法满足所有需求.这些数据有许多"方面",就像只读数据仓库可能提供的那样,涉及权限,地理位置,类别,质量和相关文档的数量.我们还组成了相当静态的记录的复杂xml表示,可以组合和存储一次.
如果完全通过触发器完成,则非规范化,计算和搜索优化的总量会引起不可接受的延迟,并且还容易发生锁定冲突.
我已经研究了一些Microsoft的SQL Server建议,我想知道是否有任何具有类似要求经验的人可以提供以下三个建议(或其他使用SQL Server/.Net堆栈的建议):
事务性复制到只读副本 - 但是从文档中不清楚可以在订户端更改模式并添加触发器,计算列或组合表;
表分区 -不改变数据,但也许是为了数据的段大面积,目前正在不断重新计算,例如权限,记录类型(60),地理区域等...将允许在事务侧触发运行少锁?
离线批处理 - 微软经常使用该短语,但除了在交易复制的订户端"检查信用卡欺诈迹象"之外,没有提供很好的例子......这将是一个很好的样本,但是如何完成究竟在实践中?每5分钟运行一次的SSIS工作?服务经纪人?连续轮询的外部可执行文件?我们要避免"跑,晚上一个漫长的过程"解决方案,我们也想避免被交易服务器上运行的更新密集聚集/合成日常每5分钟的事情事务副锁定了.
更新到#3:发布后,我发现这个SO答案带有使用变更跟踪,服务代理,SSIS和触发器的实时数据集成的链接- 看起来很有希望 - 这是推荐的路径吗?
另一个更新:反过来,它帮助我找到rusanu.com - 所有东西ServiceBroker由SO用户Remus Rusanu.异步消息传递解决方案似乎比复制方案更好地匹配我们的场景......
sql-server full-text-search data-warehouse service-broker transactional-replication
我知道该HashSet<T>.SetEquals
方法,但是何时以及如何CreateSetComparer
使用?
该文档指出:“仅在一个级别检查相等性;但是,您可以将其他级别的比较器链接在一起以执行更深入的相等性测试”
一个简单的例子是什么?
特别是,如果我要比较的集合中的每个项目也包含 HashSet ,那么 的正确用法是什么CreateSetComparer
?
这是我的出发点。我想知道该CreateSetComparer
方法是否适用以及如何正确使用它:
public class Foo : IEquatable<Foo>
{
public string Label { get; set; }
public string Value { get; set; }
public override string ToString() {return String.Format("{0}:{1}", Label, Value); }
// assume for this example that Label and Value are immutable once set;
public override int GetHashCode(){ return ToString().GetHashCode(); }
// simplified equality check; assume it meets my needs for this example; …
Run Code Online (Sandbox Code Playgroud) 如果我使用使用 docker compose 配置的默认redis docker 映像,如下所示:
redis-storage:
image: redis:7.0
container_name: 'redis-storage'
command: ["redis-server", "--save", "1200", "32", "--loglevel", "warning"]
volumes:
- redis-storage-data:/data
Run Code Online (Sandbox Code Playgroud)
如果至少有 32 个更改,它会正常启动并每 20 分钟写入一次磁盘。
但是,如果我使用相同的command
方法,image: redis/redis-stack-server:latest
它似乎可以正常启动,但它实际上会进入保护模式并且变得无法访问。注释掉命令,一切正常。
command
允许更改默认保存到磁盘参数的 docker-compose 格式正确的是什么?
(还尝试了替代语法command: redis-server --save 1200 32
:)