我正在使用 ASP.NET Core 实现 REST API。除了使用 cookie 进行身份验证之外,它是无状态的,因此容易受到跨站点请求伪造 (CSRF) 攻击。
幸运的是,ASP.NET Core 提供了一种保护措施:防止ASP.NET Core 中的跨站点请求伪造 (XSRF/CSRF) 攻击。
由于我的应用程序没有任何视图或页面,我只是services.AddControllers()在我的Startup.
当点击归因于 的 REST 端点时[ValidateAntiForgeryToken],我收到以下异常:
System.InvalidOperationException: 没有注册“Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.ValidateAntiforgeryTokenAuthorizationFilter”类型的服务。
使用注册我的控制器services.AddControllersWithViews()会使这个错误消失,因为它在内部注册了适当的服务。
根据文档:
当在 Startup.ConfigureServices 中调用以下 API 之一时,防伪中间件被添加到依赖注入容器中:
添加MVC
MapRazorPages
地图控制器路由
MapBlazorHub
所有这些方法在我看来都是以视图为中心的(除了MapControllerRoute我Configure在我的方法中做的Startup但它没有帮助),并且缺少服务的一部分命名空间是ViewFeatures. 这让我感到困惑,因为在我的理解中,尽管我正在开发一个没有视图的纯 Web API,但需要处理 CSRF。
我的理解有误吗?不涉及视图时如何配置CSRF保护?
如果我查看ALTER TABLE语句的语法定义,它似乎表明表名可以带有前缀schema-name.这是否意味着SQLite支持schematas(SQL Server的方式)?或者这schema-name是指另一个数据库(类似于MySQL)?
在Oracle上,我创建了一个这样的表:
CREATE TABLE "Mig1"( "Id" INTEGER NOT NULL , CONSTRAINT "PK_Mig1" PRIMARY KEY ( "Id" ) )
然后,我重命名PK:
ALTER TABLE "Mig1" RENAME CONSTRAINT "PK_Mig1" TO "PK_XXX"
然后,我重命名表:
ALTER TABLE "Mig1" RENAME TO "XXX"
然后,我尝试创建另一个使用以前重命名的表的名称的表:
CREATE TABLE "Mig1"( "Id" INTEGER NOT NULL , CONSTRAINT "PK_Mig1" PRIMARY KEY ( "Id" ) )
在这一点上,我得到:An error occurred: ORA-00955: name is already used by an existing object.这是因为不知何故,第一个表的主键仍以某种方式存在,尽管它已被重命名.如果我尝试像这样创建第二个表:
CREATE TABLE "Mig1"( "Id" INTEGER NOT NULL , CONSTRAINT "YYY" PRIMARY KEY ( "Id" ) ) …
我在 Code First 模式下使用实体框架并启用自动迁移。现在,我有它的表应该一个实体不能由EF管理(迁移)。有没有办法禁用一个特定实体(即表)的自动迁移?
我有一个私有HashSet<string>,它是只读属性的后备字段,它应该返回一个只读集合,以便调用者不能修改集合.所以我试着:
public class MyClass
{
private readonly HashSet<string> _referencedColumns;
public ICollection<string> ReferencedColumns {
get { return new ReadOnlyCollection<string>(_referencedColumns); }
}
Run Code Online (Sandbox Code Playgroud)
这不会编译为ReadOnlyCollection接受a IList<T>未实现的HashSet<T>.还有另一个包装我可以用来拯救我复制这些物品吗?为了我的目的,只需返回实现ICollection<T>(而不是IList<T>)实现的东西即可HashSet<T>.
在我的设计中,我有一个类,它有一个属性,其类型可以继承自:
public class Feed
{
...
[JsonProperty(TypeNameHandling = TypeNameHandling.Auto)]
public FeedSource Source { get; set; }
...
}
public abstract class FeedSource { ... }
public class CsvSource : FeedSource { ... }
public class DbSource : FeedSource { ... }
Run Code Online (Sandbox Code Playgroud)
我正在使用Entity Framework将此对象加载并存储到数据库,我正在使用Json.NET将此对象序列化为JSON以进行进一步处理.
我偶然发现的问题是该$type属性包含EF代理的类型名称而不是"真实"类型名称.所以代替:
$type: "System.Data.Entity.DynamicProxies.CsvSource_0B3579D9BE67D7EE83EEBDDBFA269439AFC6E1122A59B4BB81EB1F0147C7EE12"
Run Code Online (Sandbox Code Playgroud)
这对其他客户来说毫无意义,我想得到:
$type: "MyNamespace.CsvSource"
Run Code Online (Sandbox Code Playgroud)
在我的JSON中.
实现这一目标的最佳方法是什么?
我有一个项目有一个
[TestFixture, Category("Oracle")]
Run Code Online (Sandbox Code Playgroud)
和a
[TestFixture, Category("OracleOdbc")]
Run Code Online (Sandbox Code Playgroud)
一对夫妇的测试,我想执行分开使用dotnet test.
这是我在一些谷歌搜索后尝试的:
dotnet test MyProject.csproj --where "cat==Oracle" 但是这个开关不再存在了.dotnet test MyProject.csproj --filter Category="Oracle"产生0适用的测试:No test is available in ....然后,我偶然发现了这篇文章,虽然它描述了MSTest(和NUnit有CategoryAttribute而不是a TestCategoryAttribute),我试过了
dotnet test MyProject.csproj --filter TestCategory="Oracle"答对了.这次所有"Oracle"测试都已执行.但现在是令人困惑的部分.如果我运行dotnet test MyProject.csproj --filter TestCategory="OracleOdbc",所有测试都在执行,包括"Oracle" 和 "OracleOdbc".这让我想知道是否TestCategroy是NUnit的正确方法,或者这是一个错误.
我正在使用.NET命令行工具(2.1.2),项目参考是:
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
<PackageReference Include="NUnit" Version="3.8.1" />
<PackageReference Include="NUnit3TestAdapter" Version="3.9.0" />
<PackageReference Include="TeamCity.VSTest.TestAdapter" Version="1.0.7" />
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我不知道这是否重要,但我的测试项目是多目标netcoreapp2.0和net462.
xUnit 提供了(共享)类装置的概念,如测试之间的共享上下文中所述。到目前为止我还没有弄清楚是否有一种方法可以对此类装置进行参数化。例如,如果DatabaseFixture应该使用一些测试数据来丰富该数据,而这些数据取决于它所针对的测试,该怎么办?测试类可能想要插入测试数据,但只插入一次,然后针对该数据库(夹具)运行所有测试。
换句话说,如果// ... initialize data in the test database ...文档(上面引用的)也依赖于测试怎么办?因为并非所有测试都希望拥有相同的测试数据。实际上,我什至认为很多时候测试定义自己的测试数据而不是在测试数据级别上耦合测试是一种很好的做法。
就解决方法而言,我正在做的是提供一种ConfiguredWith方法,该方法接受仅执行一次的回调。为此,我需要延迟测试数据库的初始化,以便确保配置选项已设置。就像是:
public class MyDatabaseTests : IClassFixture<DatabaseFixture>
{
DatabaseFixture fixture;
public MyDatabaseTests(DatabaseFixture fixture)
{
this.fixture = fixture;
this.fixture.ConfigureWith(new DatabaseFixtureOptions
{
InitTestData = db => db.Insert(...);
};
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
对于针对数据库编写测试时感觉像是标准要求的东西来说,这看起来相当人为。
如果 xUnit 不提供开箱即用的功能,也许有人有更好的模式来解决这个问题。
这个问题似乎朝着类似的方向发展,但我不一定固定在具有该结构的解决方案上。
我有一个带有大型"消息"集合的MongoDB; 所有属于特定的消息groupId.所以从这样的出版物开始:
Meteor.publish("messages", function(groupId) {
return Messages.find({
groupId: groupId
});
});
Run Code Online (Sandbox Code Playgroud)
和这样的订阅:
Deps.autorun(function() {
return Meteor.subscribe("messages", Session.get("currentGroupId"));
});
Run Code Online (Sandbox Code Playgroud)
这让我陷入困境,因为最初currentGroupId是未定义的,但是sill mongod将耗尽CPU来查找消息groupId == null(虽然我知道没有).
现在,我尝试重写该出版物如下:
Meteor.publish("messages", function(groupId) {
if (groupId) {
return Messages.find({
groupId: groupId
});
} else {
return {}; // is this the way to return an empty publication!?
}
});
Run Code Online (Sandbox Code Playgroud)
和/或将订阅重写为:
Deps.autorun(function() {
if (Session.get("currentGroupId")) {
return Meteor.subscribe("messages", Session.get("currentGroupId"));
} else {
// can I put a Meteor.unsubscribe("messages") here!?
}
});
Run Code Online (Sandbox Code Playgroud)
哪个都有帮助.但是一旦currentGroupId …
我正在尝试DateTimeOffset在Watch窗口中查看集合中某些对象的值.所以我键入:
collection.Select(v => v.CreatedAt.ToString("O"))
Run Code Online (Sandbox Code Playgroud)
但是,尝试评估此错误会产生错误:
方法的评价System.Linq.SystemCore_EnumerableDebugView`1 [[System.String,mscorlib程序,版本= 4.0.0.0,文化=中性公钥= b77a5c561934e089]].get_Items需要调用方法System.Globalization.GregorianCalendar.get_ID,这不能被称为在这种背景下.
我本来可以指定v.CreatedAt哪些有效,但我也对毫秒感兴趣,所以我正在使用这种O格式.只是调用ToString()产生相同的错误.
所以我想知道错误消息中的"此上下文"是什么,是否有机会扩展此上下文以使其成为可能?