我想base64编码数据把它放在一个URL中,然后在我的HttpHandler中解码它.
我发现Base64编码允许使用'/'字符,这会弄乱我的UriTemplate匹配.然后我发现维基百科有一个"修改过的Base64 for URL"的概念:
存在修改的URL变体Base64,其中不使用填充'=',标准Base64的'+'和'/'字符分别替换为' - '和'_',因此使用URL编码器/解码器不再需要,并且对编码值的长度没有影响,保留相同的编码形式,以便在关系数据库,Web表单和对象标识符中使用.
使用.NET我想修改我当前的代码,从基本的base64编码和解码到使用"修改的base64 for URL"方法.有没有人这样做过?
为了解码,我知道它开头是这样的:
string base64EncodedText = base64UrlEncodedText.Replace('-', '+').Replace('_', '/');
// Append '=' char(s) if necessary - how best to do this?
// My normal base64 decoding now uses encodedText
Run Code Online (Sandbox Code Playgroud)
但是,我需要在结尾处添加一个或两个'='字符,这看起来有点复杂.
我的编码逻辑应该更简单一些:
// Perform normal base64 encoding
byte[] encodedBytes = Encoding.UTF8.GetBytes(unencodedText);
string base64EncodedText = Convert.ToBase64String(encodedBytes);
// Apply URL variant
string base64UrlEncodedText = base64EncodedText.Replace("=", String.Empty).Replace('+', '-').Replace('/', '_');
Run Code Online (Sandbox Code Playgroud)
我已经看到Guid to Base64用于URL StackOverflow条目,但是它具有已知长度,因此它们可以硬编码最后所需的等号数.
我需要在SharePoint 2010中为声明用户执行搜索模拟.为了说明这一点,我想首先说明如何使用Windows帐户,然后讨论Claims/WIF.
我可以使用以下方法为"经典"Windows集成身份验证用户执行此操作:
WindowsImpersonationContext wic = null;
try
{
WindowsIdentity impersonatedUser = new WindowsIdentity("john.doe@mydomain");
wic = impersonatedUser.Impersonate();
// do impersonated work here...
// in my case this is a SharePoint KeywordQuery
}
finally
{
if (wic != null)
{
wic.Undo();
}
}
Run Code Online (Sandbox Code Playgroud)
为了使上述功能得以实现,模拟帐户必须与当前用户位于同一个域中,我必须确保应用程序池所有者是:
(注意:如果有人可以弄清楚如何解决当前帐户必须与模拟帐户位于同一域中的问题,我很满意.)
我想对Claims/WIF帐户做同样的事情.这些帐户并不一定与AD帐户(我需要承担他们不是)相关联.
有没有办法告诉STS我想冒充某个特定帐户并为它提供该帐户的相应令牌?我没有我冒充用户的密码.
引用SharePoint Brew我必须应对在SharePoint Web前端(WFE)上运行的代码,该代码通过WCF调用调用查询处理器.我希望WCF调用位于模拟用户的上下文中.
WFE(Server1)搜索Web部件与服务应用程序代理进行通信.关联的搜索服务应用程序代理调用本地STS以获取用户的SAML令牌.收集SAML令牌后,搜索服务应用程序代理将通过WCF调用调用运行查询处理器的服务器.我将这个服务器称为"服务器2".服务器2接收传入请求并根据其本地STS验证SAML令牌.经过验证,Server 2连接到各种组件以收集,合并和安全性修剪搜索结果.服务器2将修剪后的搜索结果发送回服务器1,然后将其呈现给用户.
更多的研究使我看到ActAs和OnBehalfOf.我相信我会想要使用OnBehalfOf,但我不确定是否会有效.我发现的一些参考文献列在下面.任何指导表示赞赏.
我有一些我正在写的Web服务,我想尽可能地保持RESTful.我使用在IIS/ASP.NET/SharePoint中运行的HTTPHandler来托管这些Web服务.
我的大多数服务都期望HTTP GET.我有两个只是返回一些数据(即查询)并将是幂等的,但参数可能有点复杂.它们都可以包括服务参数中的字符,这些字符至少不允许URL的PATH部分.
使用IIS,ASP.NET和SharePoint我发现URL路径中的以下字符甚至没有进入我的HttpHandler,即使Url编码(请求爆炸,我对此没有任何简单的控制) :
(%3E)
以下字符使其成为我的HttpHandler,但即使Url编码,UriTemplate也无法正确处理它们:
所以,我有点彻底,但我需要在查询字符串中测试这些url编码的字符.看起来这在大多数情况下都会起作用.
在我的一个服务中,作为参数的特殊字符在语义上是查询/过滤器的一部分(实际上是搜索服务的搜索项),但在另一个中它们实际上不是查询/过滤器的一部分,所以理想情况下它们是路径而不是查询字符串.
我的问题是,最好的选择是什么?以下是我所知道的一些内容:
使用HTTP GET和查询字符串. 任何可能使用特殊字符的内容都应该在查询字符串和Url Encoded上. 这是我倾向于的地方,但我担心极长的查询字符串(IE有2083限制)
在路径中使用HTTP GET和base64编码.对于可能使用特殊字符的任何参数, 请使用Modified Base64 for URL,并将其作为路径的一部分(如果需要). 我试过这个并且它有效,但它有点难看.关于极长查询字符串的问题仍然存在.
使用HTTP POST和邮件正文. 任何可能使用特殊字符的东西都应该在请求的正文中. 似乎是一个不错的解决方案,但帖子被理解为不被幂和(我认为)通常意味着更改(而没有变化发生在这里).
使用HTTP GET和邮件正文. 任何可能使用特殊字符的东西都应该在请求的正文中.根据SO,这似乎是一个坏主意:请求正文和Roy Fielding的HTTP GET.
根据请求的大小,使用#3和#1或#2的组合.
其他???
请注意,在某些情况下,我可以更改周围的东西以防止特殊字符(我可能会这样做),但我无法在所有情况下都这样做.
关于URI长度,RFC2616 Sec3.2.1说明如下:
HTTP协议不对URI的长度设置任何先验限制.服务器必须能够处理它们所服务的任何资源的URI,并且如果它们提供可以生成这种URI的基于GET的表单,它应该能够处理无限长度的URI.如果URI长于服务器可以处理的长度,服务器应该返回414(Request-URI Too Long)状态(参见10.4.15节).
Note: Servers ought to be cautious about depending on …Run Code Online (Sandbox Code Playgroud) 我的问题是我无法通过简单的WatiN测试来可靠地运行我的运行Windows Server 2008和IE8的开发机器.
我已经看到了几个好帖子,但我仍然遇到问题.以下是帖子:
第一篇文章中的步骤似乎有帮助(在我的hosts文件中注释掉":: 1",将我的站点放在可信站点中,并确保我的app.config有"STA"并设置为"copy if"更新",但他们没有帮助可靠.我尝试了第二个例子中的代码,希望它会有所帮助,但事实并非如此.我使用的是WatiN 2.0版beta 1.
我的NUnit代码如下所示:
protected Browser Browser { get; set; }
[TestFixtureSetUp]
public void SetupPriorToTestsInThisFixture()
{
Browser = new IE();
Browser.GoTo(Constants.SiteCollectionUrl);
}
[TestFixtureTearDown]
public void TearDownAfterTestsInThisFixture()
{
if (Browser != null)
{
Browser.Dispose();
}
}
[Test]
public void WaterThroughThePipes()
{
Link link = Browser.Link(Find.ByText("Calendar"));
bool exists = link.Exists;
Assert.That(exists, Is.True, "Could not find 'Calendar' link.");
}
Run Code Online (Sandbox Code Playgroud)
我所看到的是,有时(虽然很少)我的测试通过了.有时断言失败(exists = false),有时我在尝试打开浏览器时会出现超时,有时我在尝试访问link.Exists时出错.
访问link.Exists的错误如下所示:
MyFixture.WaterThroughThePipes:System.Runtime.InteropServices.COMException:接口未知.(HRESULT异常:0x800706B5)
我现在似乎无法重现超时错误,因此我暂时无法提供(尽管这种情况一直都在发生).
在调试模式下运行时,我倾向于看到不同的结果,而不是在调试模式下运行.
对于它的价值,Firefox 3.0.6从未为我工作过.我喜欢它,但需要IE无论如何工作.这是我在Firefox中遇到的错误.
MyFixture(TestFixtureSetUp):WatiN.Core.Native.Mozilla.FireFoxException:无法连接到jssh服务器,请确保你已经正确安装了jssh.xpi插件----> System.Net.Sockets.SocketException:没有连接可以因为目标机器主动拒绝它127.0.0.1:9997
有任何想法吗?我真的不想回到Selenium(去那里,那样做),但我可能不得不这样做.
我有一个应用程序,允许管理员指定可以从中发出Web服务请求的有效IP地址.我只需获取配置的IP地址,并将它们与传入的请求进行比较.比较两个IPv4地址是微不足道的,我认为比较两个IPv6地址也是如此.
但是,当我注意到IPv6地址稍微复杂一点时,我的网络无知开始出现.我注意到的一个问题是,如果我查看机器上的IP地址(正在查看VMWare控制台显示的IP地址)与Web请求中的IP地址(HttpContext.Current.Request.UserHostAddress在.NET中),我注意到其中一个结束于%10和%11中的另一个:
唯一的区别是%10和%11 - 给出了什么?
我还看到IPv6地址以"/"结尾,后跟2位数.在进行比较时,我应该忽略这些最后的3位数(如果存在)吗?如果是这样,我需要寻找的有效替代结局是什么?
-----------编辑-------------
以下是基于所提供答案的解决方案......
我只是存储一个"擦除"的IP地址,并将其与"擦除"的IP地址进行比较.在这里使用.NET是我擦除IP地址的方法.从性能角度来看并不是最好的,但它确实有效.我宁愿做一个比较,GetAddressBytes()但我正在使用一个Dictionary,我决定反对创建我自己的额外步骤ByteComparer.
IPAddress incomingIp = null;
bool ipAddressParsePassed = IPAddress.TryParse(userHostAddress, out incomingIp);
if (ipAddressParsePassed)
{
IPAddress scrubbedIp = new IPAddress(incomingIp.GetAddressBytes());
string scrubbedIpStr = scrubbedIp.ToString()
}
Run Code Online (Sandbox Code Playgroud) 我有一个使用PowerShell设置的文件,其中包含我的构建版本号.我需要在MSBuild中获取它,以便我可以在构建脚本中对其进行操作.看起来很简单; 我只想获取文件的内容并将属性设置为该值.
我想可能正在做一个Exec任务,在我的文件上做一个"更多",并且捕获标准输出就可以了,但我似乎无法让它工作.似乎其他人也遇到了stdout和MSBuild的问题.这是我尝试过的:
<Exec Command="more $(BuildDirectory)\version.txt" Outputs="stdout">
<Output TaskParameter="Outputs" ItemName="BuildNumber" />
</Exec>
Run Code Online (Sandbox Code Playgroud) 我已经看到launch.jsonVisual Studio Code有权访问${workspaceFolder}.它是否也可以访问其他常见变量?我想访问当前用户的AppData文件夹,所以我可以这样做:
"program": "${appData}\\Roaming\\npm\\node_modules\\gulp\\bin\\gulp.js"
Run Code Online (Sandbox Code Playgroud)
而不是硬编码为:
"program": "C:\\Users\\jdoe\\AppData\\Roaming\\npm\\node_modules\\gulp\\bin\\gulp.js"
Run Code Online (Sandbox Code Playgroud) 我过去通过执行以下操作在SharePoint中进行了很多模仿.
SPWeb web = SPContext.Current.Web;
string currentWebUrl = web.Url;
SPUser user = web.EnsureUser(loginToImpersonate);
using (SPSite site = new SPSite(currentWebUrl, user.UserToken)
{
using (SPWeb impersonatedWeb = site.OpenWeb())
{
// Any SharePoint access here to 'impersonatedWeb'
// is impersonated as 'loginToImpersonate'
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这不需要您模拟的用户的密码,但需要运行某些代码访问安全性.另请注意,EnsureUser调用还要求当前用户为admin,但还有其他方法可用于代替EnsureUser来获取SPUser对象(尝试保持我的代码片段对于此问题简单).
现在我已经设置了阶段...我现在想要针对MOSS或WSS查询引擎执行FullTextSQLQuery或KeywordQuery,并根据模拟用户获取安全修整结果.两个对象都可以在构造函数上使用SPSite,但忽略我的模拟逻辑.它们与当前登录的用户一起使用(HTTPContext.Current.User).
还有其他构造函数:应用程序名称(字符串),对于MOSS,有一个带有ServerContext的SSP,但我不认为这些会有所帮助.
我在KeywordQuery类及其基类Query类上使用了Reflector,它非常难看.我相信确定用户的实际逻辑是非托管代码.
那么,我可以这样做吗?
我想做一些类似于 HtmlHelpers 在 ASP.NET MVC 中所做的事情。采取以下措施:
@Html.EditorFor(model => model.SomeProperty.SomeInnerProperty)
Run Code Online (Sandbox Code Playgroud)
HtmlHelper 不仅可以清楚地获得 SomeInnerProperty 的值,而且还知道我称之为该属性的“路径”,因为它创建了具有属性的适当 HTML 元素:
name="SomeProperty.SomeInnerProperty"
Run Code Online (Sandbox Code Playgroud)
我希望能够创建一个方法,该方法可以获取类似于 HtmlHelpers 的值和“路径”。我对现有的 HtmlHelpers 进行了一些反思,这看起来就像一个兔子洞。我已经能够创建一个像这样使用它的方法:
MyCustomMethod(model => model.SomeProperty.SomeInnerProperty);
private void MyCustomMethod(Expression<Func<object, object>> expression)
{
// I can inspect the expression object in the debugger here
}
Run Code Online (Sandbox Code Playgroud)
在检查“表达式”对象时,我可以通过反射来解决问题,但我不确定我的解决方案有多健壮,因为我只是通过观察来解决问题。此外,它似乎比应有的更难;就像我错过了一些简单的东西。
有任何想法吗?
我正在尝试分叉 DevOps git repo,但我反复收到此错误:
TF400860:不支持以下服务的当前版本:GitOdb。版本:1700,最小版本:1700。
这个确切的操作上周对我有用。任何想法为什么它现在不起作用?