我知道有很多关于此的问题 - 相信我,我已经阅读了很多这些问题并尝试了解答.
(此项目适用于内部公司局域网,而非互联网)
我们有一个WCF Web服务,它是RESTFUL并发送/接收JSON,它需要NTLM(Curb也会很好)auth /凭证以确保主叫用户(来自浏览器是他们所说的人),这是在浏览器/客户端和WCF绑定的服务:
<bindings>
<webHttpBinding>
<binding name="webHttpBindingAuth">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm"/>
</security>
</binding>
</webHttpBinding>
</bindings>
Run Code Online (Sandbox Code Playgroud)
使用Fiddler,我可以成功调用服务GET和POST上的方法,并提供了我调整我们发送给Web服务的JSON(例如包含会话ID),它很快就会顺利进行.
当我们尝试使用JavaScript/jQuery来调用web服务时,问题就出现了; 我们的想法是Web服务器将HTML/JS提供给客户端浏览器,然后浏览器应该调用WCF Web服务来获取会话并允许用户执行一些操作(我们总共有3个方法).
首先,我们遇到了X-Domain问题,我们试图通过让Web服务器返回正确的头文件来解决这个问题(Access-Control-Allow-Origin).这并没有阻止像SRIron这样的浏览器告诉我们;
XMLHttpRequest cannot load http://{webServiceUri}/InstantMessagingService/chat/start/{username}. Origin http://{web**Server**Uri} is not allowed by Access-Control-Allow-Origin.
Run Code Online (Sandbox Code Playgroud)
在此之后,我调查了使用Silverlight的可能性(似乎不支持NTLM auth over WebHttpBinding),反向代理已经出来,因为在dev中使用的IIS服务器将不会用于prod(我相信它是WebSphere,但不在我们的控制之下); 接下来我看了看这个:
这让我觉得WCF Web服务实际上是需要告诉浏览器允许调用它的东西(如果这是有道理的).实现了示例中的所有代码之后,我发现从未调用过ApplyClientBehavior来尝试将标头返回给客户端(也在Fiddler中监控它).更多谷歌搜索引导我:
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/707aa031-f4ff-47ab-ba5b-730f7930605e/
由于我们使用jQuery而不是某些.NET客户端/服务引用/代理/应用程序访问Web服务,所以我认为不可能预先请求发送这些标头以允许访问服务.此外,Fiddler似乎认为它正在尝试调用http://../chat/start/ ..方法时获得401 Unauthorized .
这是我用来尝试进行调用的jQuery(我提供了一些设置,希望它能够正常工作):
var url = webserviceUrl + "chat/start/" + remoteUserUri;
$.ajax({
type: 'GET',
url: url,
crossDomain: true,
beforeSend: function(xhr){ xhr.withCredentials = true; },
contentType: "application/json; charset=utf-8",
success: function …
Run Code Online (Sandbox Code Playgroud) 我之前已经发布了这个主题,但经过一年的其他事情,我已经设法再次进入泡菜.我将尝试简要概述一下场景以及当前使事情有效的尝试:
从foo服务的Javascript 通过对条形码上的WCF服务进行RESTful ajax调用(GET
或POST
取决于操作),显然这些是跨域调用,因为它们不在同一主机上.
Javascript使用jQuery(1.7.2)框架来操作DOM并执行对bar的 ajax调用,期望的内容类型为POSTS
is JSON
,并且响应来自GETS
预期JSON
(application/json).
Bar使用TransportCredentialOnly
作为安全模式配置的WCF服务和传输客户端凭证类型NTLM
,因此只有authed用户才能联系服务.
使用WCF的扩展已经为bar的 WCF服务添加了CORS支持:
http://blogs.msdn.com/b/carlosfigueira/archive/2012/05/15/implementing-cors-support-in-wcf.aspx
我们添加了额外的标题,并根据众多互联网文章对已经包含的帖子进行了修改:
property.Headers.Add("Access-Control-Allow-Headers", "Accept, Content-Type");
property.Headers.Add("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
property.Headers.Add("Access-Control-Max-Age", "172800");
property.Headers.Add("Access-Control-Allow-Origin", "http://iis.mycompany.com");
property.Headers.Add("Access-Control-Allow-Credentials", "true");
property.Headers.Add("Content-type", "application/json");
Run Code Online (Sandbox Code Playgroud)
提供有关启用CORS的信息的站点建议应该将Access-Control-Allow-Origin
响应头设置为,"*"
但在我们的情况下这是不可能的,因为我们使用以下设置进行jQuery ajax调用:
$.ajaxSetup({
cache: "false",
crossDomain: true,
xhrFields: {
withCredentials: true
}
});
Run Code Online (Sandbox Code Playgroud)
事实证明, …
我知道这可能听起来像到处都有解释的东西..但我一直在看很多asp.net /阅读视频阅读文章 - 但仍有一些东西缺失,这解释了所有这些"会员"如何联系在一起.
一方面,有这个内置的.net用户管理,允许你创建角色,用户等.然而另一方面,获取该用户,存储它(在会话等)似乎是一个奇怪的任务,从我已阅读,涉及创建自己的'Principal'对象等.
如果有人有理解和时间,他们能否给我们(我)一个简短的解释,说明这一切是什么.也许它是如何联系在一起的......我如何使用字符串用户名/密码来查看帐户是否存在,登录,检查它们是否处于正确的行动角色中?甚至可以获得用户的所有角色是其一部分?
我知道这个问题对于那些已经了解.net用户的人来说可能不太顺利,但是如果你能提供帮助,请回答.
提前谢谢了.peteski
真诚的道歉,如果我错过了这篇文章的内容,因为我在读完了几个小时之后我的智慧结束了.
我正在尝试编写一个后端服务(Windows),它将通过Azure AD连接到MS Graph API.我正在使用C#来破坏概念验证,但是在MS文档,博客等方面遇到了很多问题,这些问题相当令人费解并且质量很差.他们似乎都认为他们的API的消费者是前端桌面或基于浏览器的应用程序.
无论如何,我设法使用服务帐户的UserPasswordCredential连接到Graph,我在AuthenticationContext响应中收到一个令牌,但没有刷新令牌信息.MSDN建议该方法可能会返回刷新信息,但嘿嘿,它可能不会.
此外,阅读(或尝试阅读)ADAL 3上的博客文章(从2015年开始):
让我对刷新现在的工作方式感到困惑.这篇文章似乎暗示着令人神奇的是令牌在缓存中为你刷新,但在用我的POC测试之后情况并非如此.
我也从MS中看到了这篇文章,似乎在标题中指出:
https://msdn.microsoft.com/en-us/office/office365/howto/building-service-apps-in-office-365
然而,需要你注册应用程序,跳过弹出式箍允许访问等等.
由于我的样本正在运行,我已经尝试安排重新认证,希望在获得初始令牌(持续60分钟)后50分钟获得新令牌但是我得到相同的令牌.这意味着在60分钟1秒内,通过客户端的任何调用都会抛出异常(ServiceException,我必须检查里面的文本以查看令牌到期相关信息).对我来说,无法重新验证和刷新令牌以继续使用客户端进行更"无缝"的使用是没有意义的.
这是我的代码的精简版示例:
namespace O365GraphTest
{
using Microsoft.Graph;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Nito.AsyncEx;
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Linq;
using System.Threading;
using System.Security;
public class Program
{
// Just use a single HttpClient under the hood so we don't hit any socket limits.
private static readonly HttpProvider HttpProvider = new HttpProvider(new HttpClientHandler(), false);
public static void Main(string[] args)
{
try
{
AsyncContext.Run(() => …
Run Code Online (Sandbox Code Playgroud) 在Visual Studio 2008中,似乎当我在一行上选中它时会插入4个空格或一个制表符,但是当我退格时它会删除一个制表符,好像它是4个空格,一次一个空格.
我检查了工具中的文本编辑器设置..尝试使用空格和使用选项卡,似乎都不起作用.
有任何想法吗?
提前致谢.皮特
我一直在调查如何使用Microsoft Graph API(nuget上可用的dotnet/C#库)从Azure AD组添加(以及稍后删除)用户.
忽略所有其他的连接GraphServiceClient
等等.我正在尝试与下面的示例非常相似的代码,没有得到任何异常(建议事情很好)但是当我再次通过API获得该组时,它仍然没有任何成员!
有趣的是(作为旁白),当我memberOf
在user
对象上请求属性并告诉它扩展它时,它仍然返回null.
var user = await client.Users[userPrincipalName]
.Request()
.Select("id,memberOf")
.Expand("memberOf")
.GetAsync();
var group = await client.Groups[groupId]
.Request()
.Select("members")
.Expand("members")
.GetAsync();
group.Members.Add(user);
await client.Groups[groupId].Request().UpdateAsync(group);
// userPrincipalName => "test.user@mytenant.com"
// groupId => the object GUID for the group
Run Code Online (Sandbox Code Playgroud)
有谁知道我在这里做错了什么?我用来提供此代码的文档基于以下文档的链接:
此外,我尝试在此处建议的解决方案上设置方法,为用户设置许可证:
像往常一样,谢谢你的帮助.
彼得
额外
我也尝试在图API中寻找可能更新.Members
属性/资源而不是组本身:
await client.Groups[groupId].Members.Request(). // <-- Only has GetAsync()
Run Code Online (Sandbox Code Playgroud)
但它只有GetAync()
可用的方法.
根据答案更新
var usersGroups = await client.Users[userPrincipalName].MemberOf.Request().GetAsync();
if (!usersGroups.Any(g …
Run Code Online (Sandbox Code Playgroud) 我在联系 SQL Server Managemen Studio 2008 时遇到问题!我想创建一个链接表,将事件链接到许多受众 (EventAudience)。
可能包含的数据示例:
4 1
5 1
4 2
Run Code Online (Sandbox Code Playgroud)
但是,我不想要这个:
4 1
4 1
Run Code Online (Sandbox Code Playgroud)
我一直在寻找关系和约束......但到目前为止没有快乐!
作为问题的第二部分,我想设置 Audience 表,以便如果从 Audience 中删除一行,它将以级联方式清除 EventAudience 链接表。
一如既往,感谢任何帮助/建议!
谢谢皮特
我一直在寻找SO一段时间,但找不到我特定问题的答案:
如何使用Autofac将数据(通过构造函数或属性)注入到OWIN Startup类中?
我在Windows服务中使用Autofac,它也处理后端服务的创建等.所以我在那里进行所有配置读取和容器构建.
我希望能够注册Startup类,这样我就可以为CORS注入允许的原点,但即使我用这样的属性注册对象:
var builder = new ContainerBuilder();
// This will actually be read from config.
var origins = new[]
{
"http://localhost",
"http://localhost:8082",
};
builder.Register(c => new Startup(origins));
var container = builder.Build();
Run Code Online (Sandbox Code Playgroud)
在运行时,实例化Startup类时,callstack显示它来自外部代码,而我的Autofac构建器没有推送该属性.
理想情况下,我希望将Autofac注册保存在一个地方(Windows服务类),然后将所需数据注入Startup,这样我就可以执行以下操作(将allowedOrigins
其设置为属性或通过构造函数注入)
public void Configuration(IAppBuilder app)
{
var configuration = new HttpConfiguration();
...
var origins = string.Join(",", allowedOrigins);
var cors = new EnableCorsAttribute(origins, "*", "*") { SupportsCredentials = true };
configuration.EnableCors(cors);
....
}
Run Code Online (Sandbox Code Playgroud)
任何想法将不胜感激.谢谢
peteski
UPDATE
我应该补充一点,在尝试Autofac注册和构建之后,我开始执行以下操作来启动OWIN自我主机应用程序:
var webApp = WebApp.Start<Startup>(baseAddress);
Run Code Online (Sandbox Code Playgroud)
通过与朋友的对话,他们建议创建Startup
对象并将其传递给 …