标签: httpcontext

使用 ASP.NET MVC 的 TempData 和伪造的 HttpContext 问题

我正在使用伪造的 HttpContext (最后提供的代码),可能我错过了一些东西,因为我无法访问 TempData 集合(SetFakeControllerContext 方法的第四行)。每次我尝试时都会收到此错误消息:

“controller.TempData”引发了“System.AccessViolationException”类型的异常

调用FakeHttpContext的代码是:

    public static void SetFakeControllerContext(this Controller controller)
    {
        HttpContextBase httpContext = FakeHttpContext(string.Empty);
        var context = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller);
        controller.ControllerContext = context;
        controller.TempData = new TempDataDictionary(); //This is not necessary! It was just a test!!!!
    }
Run Code Online (Sandbox Code Playgroud)

有人知道我做错了什么吗?

public static HttpContextBase FakeHttpContext(string username){

var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var response = new Mock<HttpResponseBase>();
var session = new Mock<HttpSessionStateBase>();
var server = new Mock<HttpServerUtilityBase>();
var user = new …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc moq mocking httpcontext tempdata

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

如何使用 IRequiresRequest 在 ServiceStack 中注入 IRequest?

我需要访问请求上下文,特别是我的自定义类中的 Items,我不想让它从ServiceStackService继承或在我的 Service 中设置它。

因此,如果我有一个类似下面的类,实现者类 ( ContextItemsGetter) 也实现了IRequiresRequest,我希望该Request属性被填充。

public interface IGetContextItems
{
  string Get(string key);
}

public class ContextItemsGetter : IGetContextItems, IRequiresRequest
{
  public string Get(string key)
  {
    //someway to access http context items
    //im RequestContext.Instance.Items[key] e.g. Prop1 Prop2
    //or Request.blah but Request is always null
  }
  public IRequest Request { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack.Interfaces/Web/IRequiresRequest.cs

但是,当从真正的HTTP 请求redis 消息请求调用 SessionIdGetter 时,请求始终为空。难道我做错了什么?目的是解耦,使用Items在http请求和redis消息请求之间传递信息。

我还尝试使用 RequestContext.Instance.Items,这适用于 HTTP 请求,但在 redis 消息请求期间,项目不存在,我在调用 ExecuteMessage 之前填充的键不存在。 …

c# httpcontext servicestack

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

访问 ASP.NET Core 2.2 类库中的 HttpContext

我需要访问HttpContext.CurrentASP.NET Core 2.2 中的类库

HttpContext.Current.Request.Url.ToString().Contains("SAMLart")
Run Code Online (Sandbox Code Playgroud)

当我尝试仅尝试使用 HomeController 中的方法时,我正在尝试移植代码,但在主 Web 项目中HttpContext甚至没有移植代码。Current

c# httpcontext asp.net-core-mvc asp.net-core asp.net-core-2.0

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

使用 aspnetcore 2.2 联合 Azure AD 登录后,User.Identity.Name 为空

我尽可能地遵循 AzureAD aspnetcore 示例,尝试在我们的 aspnetcore 2.2 webapp 中实现 Azure AD 身份验证。我可以使用 Azure AD 成功登录。但是,登录后不会显示用户名。

https://github.com/Azure-Samples/active-directory-b2c-dotnetcore-webapp

该值应该从 User.Identity.Name 属性的视图中读取。

用户.身份.名称

在进一步检查中,我可以看到主要索赔已正确返回到应用程序。但是,由于某种原因 HttpContext.User 对象未正确填充。我不知道为什么会这样。当我从上面的示例中查看相同的值时,HttpContext 设置正确。为了澄清起见,我已经实现了 OnSecurityTokenValidated 处理程序并使用了以下上下文:

语境

可以看出, userPrincipal 具有预期的声明。

用户主体

但是,httpContext 没有声明。因此 User.Identity.Name 也为空:

上下文

我试图进行手动登录,但这也不起作用:

private async Task SignInUser(TokenValidatedContext tokenValidatedContext)
{
    var httpContext = tokenValidatedContext.HttpContext;
    var userPrincipal = tokenValidatedContext.Principal;

    await httpContext.SignOutAsync(AppSettings.CookieName);
    await httpContext.SignInAsync(AppSettings.CookieName, userPrincipal,
      new AuthenticationProperties
      {
          ExpiresUtc = DateTime.UtcNow.AddDays(1),
          IsPersistent = false,
          AllowRefresh = false
      });
}
Run Code Online (Sandbox Code Playgroud)

更新

姓名

我正在设置 NameClaimType,如上所示。NameClaimType 在配置中设置

任何人都知道我做错了什么?

我正在使用 Visual Studio 2017 和 aspnetcore 2.2 库。我已将 Microsoft.Identity.Client 升级到 …

c# httpcontext claims-based-identity azure-ad-b2c asp.net-core

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

IHttpContextAccessor.HttpContext.User.Identity 显示 CurrentUserService 服务中的所有空属性

我正在尝试使用Jason Taylor 的 Clean Architecture Template,这个模板使用 NSwag 自动创建一个 TypeScript 客户端(Angular),但我不需要创建一个 TS 客户端,所以我的主要目标是用 Razor Pages 替换它。我已经能够做到这一点,但当CurrentUserService被实例化时,我遇到了问题,它应该在这一行中设置 UserId:

UserId = httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);
Run Code Online (Sandbox Code Playgroud)

这是完整的CurrentUserService

using CleanREC0.Application.Common.Interfaces;
using Microsoft.AspNetCore.Http;
using System.Security.Claims;

namespace CleanREC0.WebUI.Services
{
    public class CurrentUserService : ICurrentUserService
    {
        public CurrentUserService(IHttpContextAccessor httpContextAccessor)
        {
            UserId = httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);
        }

        public string UserId { get; }
    }
}
Run Code Online (Sandbox Code Playgroud)

第一次甚至 HttpContext 为,这很好,因为一切都在初始化,但随后的调用总是在所有httpContextAccessor.HttpContext.User.Identity属性上返回null,用户显示了一个身份,但它的所有属性和声明都是nullYield no results,即使用户正确登录。

这是我对模板所做的事情的列表:

  • 摆脱了NSwag和所有与TypeScript相关的东西 …

c# identity dependency-injection httpcontext clean-architecture

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

在 C# 单元测试中使用 HttpContext.GetTokenAsync

我正在尝试为我的控制器类编写单元测试,它使用以下命令检索令牌:

string token = await HttpContext.GetTokenAsync("access_token");
Run Code Online (Sandbox Code Playgroud)

因此,我用以下代码模拟了 HttpContext:

public static HttpContext MakeFakeContext()
{
    var serviceProvider = new Mock<IServiceProvider>();
    var authservice = new Mock<IAuthenticationService>();

    authservice.Setup(_ => _.GetTokenAsync(It.IsAny<HttpContext>(), It.IsAny<string>())).Returns(Task.FromResult("token"));
    serviceProvider.Setup(_ => _.GetService(typeof(IAuthenticationService))).Returns(authservice);

    return new DefaultHttpContext
    {
        RequestServices = serviceProvider.Object
    };
}
Run Code Online (Sandbox Code Playgroud)

我正在设置模拟上下文:

var mockcontext = MakeFakeContext();

unitUnderTest.ControllerContext = new ControllerContext
{
    HttpContext = mockcontext
};
Run Code Online (Sandbox Code Playgroud)

现在,当我运行单元测试时,出现以下错误:

System.NotSupportedException:不支持的表达式:_ => _.GetTokenAsync(It.IsAny(), It.IsAny()) 扩展方法(此处:AuthenticationTokenExtensions.GetTokenAsync)不能用于设置/验证表达式。

在我的研究过程中,我偶然发现了一些解决方案,您可以在其中模拟引擎盖下不属于扩展的特定部分。这些是其中一些:Moq IServiceProvider / IServiceScope如何对 HttpContext.SignInAsync() 进行单元测试?. 第二个显示了类似的问题,在我尝试后似乎有效。但由于某种原因,它不适用于 GetTokenAsync 方法。

大家有什么提示吗?

c# unit-testing moq xunit httpcontext

4
推荐指数
3
解决办法
2039
查看次数

Blazor 服务器应用程序中的 HttpContext.Session

我正在尝试HttpContext.Session在我的 ASP.NET Core Blazor Server 应用程序中使用(如本MS Doc 中所述,我的意思是:在启动时全部正确设置)

这是我尝试设置值时的代码部分:

var session = _contextAccessor.HttpContext?.Session;
if (session != null && session.IsAvailable)
{
    session.Set(key, data);
    await session.CommitAsync();
}
Run Code Online (Sandbox Code Playgroud)

当这个代码在剃刀称为组件OnAfterRenderAsyncsession.Set抛出以下异常:

响应开始后无法建立会话。

我(可能)理解该消息,但这使得 Session 基础设施非常不可用:应用程序需要在执行的每个阶段访问其状态......

我应该完全忘记DistributedSession基础设施,而去使用 Cookies 或浏览器 SessionStorage 吗?...或者这里是否有解决方法仍在使用HttpContext.Session?我不想只是为了较低级别的实现而放弃分布式会话基础设施......

(仅供参考:浏览器的会话存储不是跨选项卡,这很痛苦)

session httpcontext asp.net-core blazor-server-side

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

删除HttpContext.Current.Session

我有一个存储会话变量的应用程序.当我进行注销时,我在可用会话上调用RemoveAll()方法.

该方法似乎不起作用.你知道如何强制删除Session变量吗?

问候.

c# asp.net session class httpcontext

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

为什么我的HttpApplication实例变量为null?

我有一个MVC3应用程序,我已经添加了几个简单的缓存变量作为属性.我添加了我的数据,Application_Start然后在控制器中尝试将其转换HttpContext.ApplicationInstance回我的类型以访问它.但是,该属性始终为null.这是一个例子:

编辑工作实例

public interface IMyMvcApp
{
    Hashtable Cache {get;set;}
}


public class MvcApplication: HttpApplication, IMyMvcApp
{

    public Hashtable Cache 
    {
        get { return Context.Cache["MyStuff"] as Hashtable; }
        set { Context.Cache["MyStuff"] = value}
    }

    public void Application_Start()
    {
        Cache = new Hashtable();
        Cache.Add("key", new object());
    }
}

public class AController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext context)
    {
        var myApp = context.HttpContext.ApplicationInstance as IMyMvcApp;

        Assert.IsNotNull(myApp.Cache);
    }
}
Run Code Online (Sandbox Code Playgroud)

c# httpcontext asp.net-mvc-3

3
推荐指数
1
解决办法
2518
查看次数

我们可以使用Response.Flush()而不是Response.End()

Response.End()生成ThreadAbortException.

HttpContext.Current.ApplicationInstance.CompleteRequest它代替它并不能解决问题.

那么,我们可以使用Response.Flush()而不是Response.End()

c# asp.net response.redirect response httpcontext

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