小编Mar*_*cin的帖子

一种在MVC 4应用程序中正确处理HttpAntiForgeryException的方法

这是场景:

我有一个登录页面,当用户签名时,它会被重定向到主页应用程序页面.然后用户使用浏览器后退按钮,现在他在登录页面上.他尝试再次登录,但现在抛出异常:

HttpAntiForgeryException(0x80004005):提供的防伪令牌适用于用户"",但当前用户是"userName".

我知道这与缓存有关.我使用自定义NoCache过滤器禁用了浏览器缓存以进行登录操作,该过滤器设置了所有必需的标头 - 无缓存,无存储,必须重新验证等.但是

  • 这不适用于所有浏览器
  • 特别是Safari(在大多数情况下是移动设备)完全忽略了这样的设置

我将尝试制作黑客并强制Safari移动刷新,但这不是我所期待的.

我想知道我是否可以:

  • 处理异常而不显示用户存在任何问题(对用户完全透明)
  • 通过更换防伪造令牌的用户名防止这个问题,这将再次允许用户登录没有这个例外,如果我涉及到浏览器的缓存黑客会在浏览器的下一个版本中停止工作.
  • 我真的不想依赖浏览器行为,因为每个行为都不同.

更新1

为了澄清一下,我知道如何处理MVC中的错误.问题是这个处理错误根本解决了我的问题.错误处理的基本思想是重定向到自定义错误页面,并带有好消息.但我希望防止发生此错误,而不是以用户可见的方式处理它.通过句柄我的意思是捕获用户名替换或其他合适的操作然后继续登录.

更新2

我添加了下面的解决方案,这对我有用.

c# asp.net-mvc antiforgerytoken

35
推荐指数
3
解决办法
2万
查看次数

Visual Studio 2017 csproj核心文件排除

我已经将xproj核心项目迁移到了csproj.一切都运行良好,但我仍然遇到发布配置问题.基于文档:https: //docs.microsoft.com/en-us/dotnet/articles/core/tools/project-json-to-csproj我应该能够在发布期间排除文件.

我在f中添加了以下行

<None Include="*.json" CopyToPublishDirectory="Never" />
<None Include="wwwroot\**\*.map;wwwroot\**\*.less;*.pdb" CopyToPublishDirectory="Never" />
<None Include="wwwroot\**\*" CopyToPublishDirectory="PreserveNewest" />
Run Code Online (Sandbox Code Playgroud)

但仍然*.map,.json.less文件复制到发布文件夹.我试过不同的顺序没有运气.

如何从发布中排除某些文件?

csproj .net-core asp.net-core visual-studio-2017

16
推荐指数
1
解决办法
4645
查看次数

MVC4的样式捆绑不使用min文件

我有4个文件:

  • a.css
  • a.min.css
  • b.css
  • b.min.css

它们以下列方式添加到bundle中:

bundles.Add(new StyleBundle("~/Content/acss").Include("~/Content/a.css", "~/Content/b.css"));
Run Code Online (Sandbox Code Playgroud)

在调试中运行应用程序时,所有正确呈现:

 <link href="/Content/a.css" rel="stylesheet"/>
 <link href="/Content/b.css" rel="stylesheet"/>
Run Code Online (Sandbox Code Playgroud)

但是当在发行版中运行时,我会以下列方式呈现它:

 <link href="/Content/acss?v=mUdXE7_fXKjICzE_XteIB1Igy6TekX1QFh-BtY6fFUw1" rel="stylesheet"/>
Run Code Online (Sandbox Code Playgroud)

在我的建立里面:

/*缩小失败.返回未经授权的内容.(24,708):运行时错误CSS1030:预期的标识符,找到'.'

所以我有两个问题:

  1. 为什么它不按照在线文档工作?所有信息都表明如果可用于发布版本,它会选择min文件?
  2. 如何根据文档使其工作?

c# asp.net-mvc

11
推荐指数
1
解决办法
9974
查看次数

ASP.Net MVC上的防伪系统

当我输入以下代码时:

 @using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm" }))
    {
        @Html.AntiForgeryToken()
        <a href="javascript:document.getElementById('logoutForm').submit()">Log off</a>
    }
Run Code Online (Sandbox Code Playgroud)

@Html.AntiForgeryToken()
Run Code Online (Sandbox Code Playgroud)

部分被抛出以下异常:

提供的"System.Web.Security.FormsIdentity"类型的标识标记为IsAuthenticated = true,但没有Name的值.默认情况下,防伪系统要求所有经过身份验证的身份都具有唯一的名称.如果无法为此标识提供唯一的名称,请考虑将静态属性AntiForgeryConfig.AdditionalDataProvider设置为可为当前用户提供某种形式的唯一标识符的类型的实例.

我查了很多例子并尝试搜索网页,但我找不到任何解释.我想知道为什么这个错误发生在我身上?如何解决它使用防伪.

c# asp.net-mvc

10
推荐指数
2
解决办法
8556
查看次数

实体框架4.3不创建数据库

我创建了新项目并添加了最新的实体框架(版本4.3).我像以前的EF版本一样创建了类和上下文.但是,在第一次运行时应该创建数据库(在我的情况下是SQL Server 2005),我收到以下错误:

执行命令定义时发生错误.有关详细信息,请参阅内部异常

具有以下内部异常:

无效的对象名称'dbo .__ MigrationHistory'.

据我了解,此表适用于迁移,但如果没有数据库,则此表不存在.难道我做错了什么?

更多信息:出于测试目的,我只创建了一个类:

public class Test
{ 
  [Key]
  public int TestId { get; set;}

  public string Name {get; set;}
}

public class Context : DbContext
{
   public Context() : base("MyConnection")
   {
   }

   public DbSet<Test> Tests { get; set;}
}
Run Code Online (Sandbox Code Playgroud)

更新1

经过一些测试后,我意识到应用程序正在从视觉工作室抛出未处理的异常并在视觉工作室中中断.System.Data.EntityCommandExecutionException是一个例外.一旦我忽略了这个期望并且没有停止代码执行,就创建了数据库.

更新2

在使用数据库几个小时之后,我发现使用Enable-Migrations选项和来自控制台的Update-Database也正在解决这个问题.它在应用程序启动之前创建数据库,并且不会在Visual Studio中中断.

.net c# entity-framework

6
推荐指数
1
解决办法
3448
查看次数

实体框架代码第一外键添加索引

我在EF 6代码中有简单的表定义 - 首先是简单的外键.

public class Address
{
        /// <summary>
        /// Gets or sets the id.
        /// </summary>
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Column(Order = 1)]
        public int Id { get; set; }

         /// <summary>
        /// Gets or sets the town.
        /// </summary>
        public virtual Town Town { get; set; }

        /// <summary>
        /// Gets or sets the paf address town id.
        /// </summary>
        [Column(Order = 2)]
        public int TownId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

创建表时,它正在创建外键和索引.我想知道为什么,因为这样的索引通常非常低效,而对于大型数据库,它会导致很多问题.那么为什么它只创建该索引而不是外键.以及如何默认禁用此类索引创建.

c# entity-framework ef-code-first

6
推荐指数
1
解决办法
4695
查看次数

一种从WebApi中的HttpRequestHeaders中删除特定cookie的方法

我试图删除特定Set-Cookie的报头HttpResponseHeadersOnActionExecuted的方法ActionFilter.

我遇到的问题很少:

  1. 我看不到枚举头的方式.即使我在调试器中看到标题,该集合也始终为空.
  2. 因为我无法枚举,我无法删除特定的标题.我只能删除具有相同密钥的所有标头,但Set-Cookie可以有多个条目.

目前我正在删除所有cookie,但这不是我想要的.

public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{                
   HttpResponseHeaders headers = actionExecutedContext.Response.Headers;
   IEnumerable<string> values;
   if (headers.TryGetValues("Set-Cookie", out values))
   {
       actionExecutedContext.Response.Headers.Remove("Set-Cookie");
   }

   base.OnActionExecuted(actionExecutedContext);
}
Run Code Online (Sandbox Code Playgroud)

c# cookies asp.net-web-api asp.net-web-api2

6
推荐指数
1
解决办法
4726
查看次数

ASP.NET Core中的全局过滤器顺序

我在Startup中有两个全局异常过滤器

config.Filters.AddService(typeof(ExceptionFilter));
Run Code Online (Sandbox Code Playgroud)

config.Filters.AddService(typeof(JsonExceptionFilter));
Run Code Online (Sandbox Code Playgroud)

我总是觉得如果首先添加相同的过滤器,它首先执行.

但是当我ExceptionFilter第一次添加时,它会被执行第二次.

更新1

ConfigureServices 方法:

services
    .AddMvc(
         config =>
         {
            config.Filters.AddService(typeof(ExceptionFilter));
            config.Filters.AddService(typeof(JsonExceptionFilter));
         });
Run Code Online (Sandbox Code Playgroud)

c# action-filter asp.net-core

5
推荐指数
1
解决办法
2240
查看次数

无法在ASP.Net Core应用程序中设置默认和仅文化

我正在研究波兰语操作系统:

在我的Statup.cs班上,我有以下代码

        // Configure the localization options
        var supportedCultures = new[]
        {
            new CultureInfo("en-GB")
        };

        app.UseRequestLocalization(
            new RequestLocalizationOptions
            {
                DefaultRequestCulture = new RequestCulture("en-GB"),
                SupportedCultures = supportedCultures,
                SupportedUICultures = supportedCultures,
                FallBackToParentCultures = true,
                FallBackToParentUICultures = true,
                RequestCultureProviders = null
            });
Run Code Online (Sandbox Code Playgroud)

完整选项仅供参考,以确保后面没有任何设置.在我的_Layout.cshtml我有以下代码:

<div>Current Culture: @CultureInfo.CurrentCulture.DisplayName</div>
<div>Current UI Culture: @CultureInfo.CurrentUICulture.DisplayName</div>
Run Code Online (Sandbox Code Playgroud)

唯一受支持和可用的文化应该是en-GB,但是在网站上它始终显示:

Current Culture: Polski (Polska)
Current UI Culture: Polski (Polska)
Run Code Online (Sandbox Code Playgroud)

我试图添加Microsoft.AspNet.Localization包,但它没有任何区别.基于本地化中间件中的代码,所有应该按预期工作.我正在运行最新版本的ASP.NET Core 1.0.0.

localization asp.net-core asp.net-core-localization

4
推荐指数
1
解决办法
1223
查看次数

如何在发布期间使用x64 aspnet_compiler

我有MVC 5应用程序,它使用RazorGenerator.MVC和RazorGenerator.MsBuild.因此我的MvcBuildViews设置为false,因为不再需要它.该应用程序是Visual Studio 2012中的.NET 4.5.

当我使用Web发布工具发布我的应用程序时(右键单击MVC项目 - >发布),我在发布期间使用选项进行预编译.

当我使用任何CPU或x32平台时,一切都运行良好.但是,当我尝试发布x64应用程序时,我遇到了aspnet_compiler的问题.

它始终尝试使用:*C:\ Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe*一个而不是64个版本,因此我的应用程序无法使用x64平台发布.

我找到的唯一可以改变路径的地方是在MvcBuildViews目标下,但是因为它总是对我来说是假的,它永远不会达到这个目标而且不能使用AspNetCompiler ToolPath.

我想知道从哪里(哪个目标文件或任务文件)包含该路径?我搜索了所有我认为无法找到的目标.

msbuild asp.net-mvc 64-bit publish visual-studio-2012

2
推荐指数
2
解决办法
2579
查看次数

使用TestServer测试ASP.NET Core完整.NET Framework提供了vs 2017中未找到的方法

尝试在Visual Studio 2017中运行测试时,所有都在编译时没有问题,但是当我尝试创建服务器和客户端进行测试时:

this.Server = new TestServer(
                new WebHostBuilder()
                    .UseStartup<Startup>()
                    .UseContentRoot(di.FullName));

 this.Client = this.Server.CreateClient();
Run Code Online (Sandbox Code Playgroud)

TestServer是抱怨错误的依赖(它会尝试加载版本1.0.0),即使TestHost包是:

<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="1.1.1" />
Run Code Online (Sandbox Code Playgroud)

测试失败也有异常:

Cannot find method: 'System.Net.Http.HttpClient Microsoft.AspNetCore.TestHost.TestServer.CreateClient()'..
Run Code Online (Sandbox Code Playgroud)

unit-testing asp.net-core visual-studio-2017

2
推荐指数
1
解决办法
1447
查看次数