我开发了一个Outlook VSTO插件.某些任务应该在后台线程上完成.通常,检查本地数据库中的某些内容或调用Web请求.阅读了几篇文章之后,我放弃了在后台线程中调用Outlook对象模型(OOM)的想法.
我有一些wpf控件,我成功地设法使用.NET 40 TPL执行异步任务,并在完成时"完成"主VSTA线程中的作业(即访问UI或OOM).
为此,我使用了以下形式的语法:
Task<SomeResult> task = Task.Factory.StartNew(()=>{
//Do long tasks that have nothing to do with UI or OOM
return SomeResult();
});
//now I need to access the OOM
task.ContinueWith((Task<SomeResult> tsk) =>{
//Do something clever using SomeResult that uses the OOM
},TaskScheduler.FromCurrentSynchronizationContext());
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但现在我想在OOM中挂钩没有Form/WPF控件的事件时做类似的事情.确切地说,我的问题来自于TaskScheduler.FromCurrentSynchronizationContext()抛出异常的事实.
例如,
Items inboxItems = ...;
inboxItems.ItemAdd += AddNewInboxItems;
private void AddNewInboxItems(object item)
{
Task<SomeResult> task = Task.Factory.StartNew(()=>{
//Do long tasks that have nothing to do with OOM
return SomeResult()});
var scheduler = …Run Code Online (Sandbox Code Playgroud) 我有一个多租户ASP.NET应用程序使用OpenIdConnect和Azure AD作为Office 365的身份提供程序.当用户通过身份验证后,我收到了我的声明ClaimsPrincipal.Current.
我想识别用户并将此id引用存储在我的数据库中.我问了这个问题.有人回答说
当尝试唯一地识别用户时[NameIdentifier]应该是您的首选.
但似乎NameIdentifier声称,http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier
取决于应用程序.确切地说,如果我在Azure AD中创建另一个应用程序,那么NameIdentifier对于同一个真正的 Office365用户来说,它们将是不一样的.请记住,我们可能必须创建另一个Azure AD清单(因为我们可能需要其他范围),我们应该能够找回相同的最终用户.
与此同时,我评论了另一个主张: ObjectIdentifier http://schemas.microsoft.com/identity/claims/objectidentifier
ObjectIdentifier对于给定的Office 365用户,所有Azure AD保护的应用程序似乎都是相同的.
你能准确解释这两种说法之间的区别吗?更重要的是,您是否可以确认ObjectIdentifier可以在任何Office 365订阅中将其用作用户的"通用"标识符.
claims-based-identity azure-active-directory office365api azure-ad-graph-api
我确实有一个运行 .net core 2 应用程序的 Docker 容器。
使用此代码配置日志记录 Program.cs
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
})
.UseStartup<Startup>();
Run Code Online (Sandbox Code Playgroud)
和appsettings.json文件
{
"Logging": {
"LogLevel": {
"Default": "Information"
}
},
}
Run Code Online (Sandbox Code Playgroud)
日志好像还可以,直接运行Kestrel的时候,可以在终端看到日志。同样的事情,当容器化时:命令docker logs显示了我想要的。
在 Azure Web App 中作为容器运行时,生产中会出现问题。我找不到任何一致的 docker 日志。
我尝试通过 FTP 或通过 urlhttps://[mysite].scm.azurewebsites.net/api/logs/docker访问日志文件,例如,日志文件几乎为空
https://[mysite].scm.azurewebsites.net/api/vfs/LogFiles/2018_09_09_RD0003FF74F63E_docker.log,仅存在容器起始行

此外,我在通常的门户界面中也有相同的行。
问题是:Azure Web App 的 docker.log 文件中会自动输出 docker 日志吗?有什么我想念的吗?
c# azure docker azure-web-app-service azure-web-app-for-containers
我们有一个多租户应用程序,它使用Azure DocumentDB作为我们的NoSQL文档导向数据库.
对于多租户,我们会阅读此问题和此博客文章.因为现在我们的用户数量不满足使用不同数据库的需要和/或documentCollections更重要的是,为了节省成本,我们在TenantId字段上使用"Where"子句实现多租户documentCollection.
类似地,当涉及存储具有完全不同性质的"文档"或"对象"时(例如Book和Car),我们对使用它的事实提出质疑documentCollection.
首先,创建两个不同的documentCollectionfor Book和看起来更合理Car.但是,documentCollection最低成本为25美元.我们不想每次需要添加新功能时支付+ 25美元,即使它是存储少量数据(例如我们的应用程序存储了很多Books但很少Cars......).
把书和车放在一起是一个好的设计documentCollection吗?并在共享成员中保留对文档类型的引用(例如string Type ="Book" or string Type = "Car").
知道我们已经使用Where"子句"实现了多租户,在我们的应用程序中查询给定租户的所有汽车,我们的查询都将包含Where TenantId ="XXXX" AND Type = "Car".
我已经看到DocumentDB现在支持Partitioned Collection.这可能是对分区的良好使用,或者相反,它们应该保持以实现更好的可伸缩性,并且不适合隔离其对象数量可能不相似的不同文档类型?
我创建了一个ASP.NET WEB API 2.2项目.我使用基于Windows Identity Foundation的模板为visual studio中提供的个人帐户在此处查看.
Web客户端(用angularJS编写)使用带有Web浏览器cookie的OAUTH实现来存储令牌和刷新令牌.我们受益于有用的UserManager和RoleManager类,用于管理用户及其角色.使用OAUTH和Web浏览器客户端一切正常.
但是,对于基于桌面的客户端的一些复古兼容性问题,我还需要支持基本身份验证.理想情况下,我希望[授权],[授权(角色="管理员")]等属性与OAUTH和基本身份验证方案一起使用.
因此,遵循LeastPrivilege的代码,我创建了一个继承自AuthenticationMiddleware的OWIN BasicAuthenticationMiddleware.我来到以下实现.对于BasicAuthenticationMiddleWare,与Leastprivilege的代码相比,只有Handler发生了变化.实际上我们使用ClaimsIdentity而不是一系列Claim.
class BasicAuthenticationHandler: AuthenticationHandler<BasicAuthenticationOptions>
{
private readonly string _challenge;
public BasicAuthenticationHandler(BasicAuthenticationOptions options)
{
_challenge = "Basic realm=" + options.Realm;
}
protected override async Task<AuthenticationTicket> AuthenticateCoreAsync()
{
var authzValue = Request.Headers.Get("Authorization");
if (string.IsNullOrEmpty(authzValue) || !authzValue.StartsWith("Basic ", StringComparison.OrdinalIgnoreCase))
{
return null;
}
var token = authzValue.Substring("Basic ".Length).Trim();
var claimsIdentity = await TryGetPrincipalFromBasicCredentials(token, Options.CredentialValidationFunction); …Run Code Online (Sandbox Code Playgroud) claims-based-identity wif owin asp.net-web-api2 asp.net-identity-2
我建立一个连接处使用365个服务的多租户Web应用程序Microsoft.Owin.Security.OpenIdConnect,版本= 3.0.0.0和天青与Active Directory Microsoft.IdentityModel.Clients.ActiveDirectory,版本= 2.19.0.0下面这个样本.
我们的Web应用程序客户端(用户代理)使用asp.NET cookie对我们的服务器进行身份验证,而我们的服务器和授权服务器(此处为Azure AD)之间的身份验证是使用OpenID授权代码流进行的.
我们为Asp.NET cookie设置了30天的滑动到期时间.但是,即使设置了UseTokenLifetime = true,我们仍然有来自Authority Server的短暂的AuthenticationTicket,它应该与两个身份验证机制的生命周期相匹配.
我们遇到的问题是:我们的最终用户必须经常重新登陆(少于一小时).问题是,我们如何在这个owin openidconnect中间件中增加/更改身份验证票证的生命周期?
备注:我还发布了一个关于ADAL使用刷新令牌的问题.根据我们的理解,此问题仅与身份验证有关.作为ActiveDirectory客户端管理的授权问题的access_token和refresh_token的生存期与此问题无关.如果我错了,请纠正我.
Startup.Auth.cs
public partial class Startup
{
public const string CookieName = ".AspNet.MyName";
public const int DayExpireCookie = 30;
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
var cookieAuthenticationOptions = new CookieAuthenticationOptions()
{
CookieName = CookieName,
ExpireTimeSpan = TimeSpan.FromDays(DayExpireCookie),
AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
SlidingExpiration = true,
};
app.UseCookieAuthentication(cookieAuthenticationOptions);
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = …Run Code Online (Sandbox Code Playgroud) 我正在将 Azure AD 安全应用程序迁移到 v2.0 端点。
我需要将自定义参数传递给回复 uri。对于以前的 Azure AD 端点,我通过向回复 url 添加一个常用的查询参数来做到这一点。e.g. https://myserver.com/myredirect_uri?mycustomparamerter=myvalue
不幸的是,在端点 2.0 中,我收到一条错误消息,指出回复 uri 与注册的 uri 不匹配。当然,我的自定义参数值是动态的,我无法对其进行硬编码。
我希望利用OAUTH flow 中描述的“状态”参数。但是,I am using Microsoft.Owin.Security.OpenIdConnect看起来参数已经设置,所以我无法利用它。我正在使用一个基于 MVC 的流程实现,它看起来像这个示例。
您能否提出一种解决方法,以便我的服务器在流程开始时设置的回复 url 中接收自定义参数?
我按照此文档使用Graph API版本1.6列出了Office 365租户中的用户.
我想过滤作为用户引用的Office 365共享邮箱,然后在请求时返回/users/.(例如contact@contoso.com,support@contoso.com).
从我所看到的,没有办法区分代表共享邮箱的用户和"常规"用户.有人有机制来过滤这样的邮箱吗?不是在我的情况下,JSON成员userType总是如此null.
我的用户无法使用我们的服务,因为Outlook REST API返回以下错误代码RESTAPINotEnabledForComponentSharedMailbox。
看来他们的邮箱不是共享邮箱。那是什么样的邮箱?
您能告诉我更多有关此错误的信息吗?有什么可以做的吗?
我在使用EntityFramework和以下数据模型时遇到了一些麻烦(参见简化图).

Matter对象可以被认为是"主要容器".有Bill和BillRecord.从Bill到BillRecord有一对多的关联.确切地说,Bill可以引用许多BillRecord(可能是0),BillRecord最多可以引用一个Bill.
1)我希望能够删除BillRecord但是如果存在关联则不应该删除Bill(这就是为什么我没有在BillRecords实体上设置OnCascadeDelete For Bill).同样,如果我删除一个账单,我不想删除可能与之关联的BillRecord.
2)然而,当我删除一个问题时,我希望一切都消失:问题,比尔和比尔记录.
使用以下代码,如果没有与Bill相关联的BillRecord,我设法有1)正确和2)工作,如果有,我得到以下错误.
System.Data.SqlServerCe.SqlCeException: The primary key value cannot be deleted because references to this key still exist. [ Foreign key constraint name = FK_dbo.BillRecordDboes_dbo.BillDboes_BillId ]
Run Code Online (Sandbox Code Playgroud)
这是我的实体和OnModelCreating的逻辑
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MatterDbo>().HasMany<BillRecordDbo>(s => s.BillRecordDbos)
.WithRequired(s => s.Matter).HasForeignKey(s => s.MatterId).WillCascadeOnDelete(true);
modelBuilder.Entity<MatterDbo>().HasMany<BillDbo>(s => s.BillDbos)
.WithRequired(s => s.Matter).HasForeignKey(s => s.MatterId).WillCascadeOnDelete(true);
}
public class MatterDbo
{
public MatterDbo()
{
BillDbos = new List<BillDbo>();
BillRecordDbos = new List<BillRecordDbo>();
}
public Guid Id { get; set; }
public virtual List<BillDbo> …Run Code Online (Sandbox Code Playgroud)