当前位置: 首页 > 知识库问答 >
问题:

设置来自Web Api 2的cookie I说服力过滤器说服力Async方法

孙梓
2023-03-14

使用 Web API 2.2,我有一个自定义的 IAuthenticationFilter,用于使用自定义方案对客户端请求进行身份验证。

基本上,当客户端没有经过身份验证并且想要访问受保护的资源时,他会在请求旁边发送一个Authoration标头:Authoration: MyCUom的XXXXXXX。然后过滤器验证凭据,验证用户身份,并生成无状态身份验证令牌以进行进一步访问(类似于JWT)。

我想将生成的身份验证令牌存储在cookie中。当出现在传入请求中时,cookie会在单独的过滤器中进行本地验证(此处未显示)。

我的问题是,如果我尝试这样设置cookie:

Task IAuthenticationFilter.AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
{
    if (context.Request.Headers.Authorization != null &&
        string.Equals(context.Request.Headers.Authorization.Scheme, "MyCustomScheme", StringComparison.OrdinalIgnoreCase))
    {
        // This works
        CustomPrincipal principal = this.ValidateCredentials(context.Request.Headers.Authorization.Parameter);
        context.Principal = principal;

        // This doesn't work: context.ActionContext.Response is null
        var cookie = new CookieHeaderValue("MySessionCookie", principal.AuthenticationToken) { Path = "/", HttpOnly = true };
        context.ActionContext.Response.Headers.AddCookies(new CookieHeaderValue[] { cookie });
    }
    return Task.FromResult(0);
}

然后它会失败,因为<code>context.ActionContext。响应为空。如何将cookie添加到AuthenticateAsync中的响应?

请参阅相关内容:为IAuthenticationFilter在HttpAuthenticationContext中设置Cookie值(您可以在评论中看到人们遇到了相同的问题)。

共有3个答案

牛景同
2023-03-14

您可能需要实现I

请参见:http://www.strathweb.com/2012/11/adding-session-support-to-asp-net-web-api/

商迪
2023-03-14
匿名用户

除了< code > IAuthenticationFilter 之外,我还通过实现< code>IActionFilter使过滤器工作。这个方法是有效的,因为您可以在同一个地方访问请求、响应和用户身份。这是我的实现:

async Task<HttpResponseMessage> IActionFilter.ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
{
    // Process the request pipeline and get the response (this causes the action to be executed)
    HttpResponseMessage response = await continuation();

    // If the user is authenticated and the token is not present in the request cookies, then it needs to be set
    CustomPrincipal principal = actionContext.ControllerContext.RequestContext.Principal as CustomPrincipal;
    if (principal != null && !actionContext.Request.Headers.GetCookies("MySessionCookie").Any())
    {
        // Set the cookie in the response
        var cookie = new CookieHeaderValue("MySessionCookie", principal.AuthenticationToken) { Path = "/", HttpOnly = true };
        response.Headers.AddCookies(new CookieHeaderValue[] { cookie });
    }

    return response;
}

我发现这种方法非常不实用(混合接口),您绝对应该可以访问 IAuthenticationFilter.AuthenticateAsync 中的响应(通过示例的异步延续回调,或者能够通过访问上下文中的操作结果 (IHttpActionResult),就像在同一接口的 ChallengeAsync 方法中一样)。

戚默
2023-03-14

我的要求是添加标题,但添加cookie应该很容易。

我对此采取了不同的方法。我把我想添加的标头放在上下文中。请求。属性。然后在中,通过IHttpActionResault,我检查属性的存在,如果存在,将其添加到标头中。如下所示:

protected class AddRenewOnAauthorizedResult : IHttpActionResult {

    public const string RenewalPropertyKey = "ETicket.RenewalKey";

    public AddRenewOnAauthorizedResult(HttpRequestMessage request, IHttpActionResult innerResult) {
        this.Request = request;
        this.InnerResult = innerResult;
    }

    public HttpRequestMessage Request { get; set; }
    public IHttpActionResult InnerResult { get; set; }

    public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) {

        HttpResponseMessage response = await this.InnerResult.ExecuteAsync(cancellationToken);

        if (Request.Properties.ContainsKey(RenewalPropertyKey)) Request.response.Headers.Add("X-ETicket-Renew", Request.Properties(RenewalPropertyKey));

        Return response;

}

}

然后在ChallengeAsync中:

public Threading.Tasks.Task ChallengeAsync(HttpAuthenticationChallengeContext context, Threading.CancellationToken cancellationToken)
{

    context.Result = new AddRenewOnAauthorizedResult(context.Request, context.Result);
    return Task.FromResult(0);

}

 类似资料:
  • 我正在构建一个应用程序,以Laravel作为前端,Angular作为后端。我正在对用户发表的帖子和评论实施一个类似的系统。我与我的like系统有多态关系,因为用户可以喜欢帖子和评论。我的模型是这样的: 像模特 后模型 注释模型 我不知道该怎么做。当我加载一篇帖子或一条评论时,我想检索帖子的详细信息(我已经可以检索到了)以及喜欢它的人。如何在帖子中加载“喜欢”的数据?我应该在这里使用多态关系吗?提前

  • 我对雄辩和L4.2有意见 我正在尝试在下面设置自定义轴模型: 下面是我的自定义透视模型“活动用户” 制作模型有一些类似于hasMany(“活动用户”)的方法,称为campaign\u user。 我试着做一些事情,比如: 但我犯了以下错误: 传递给__construct()的Argument 1必须是Illumate\Database\Eloquent\关系\Pivot::模型的一个实例,没有给出

  • 我有一个帖子和评论模型。 Post与评论有很多关系。评论与文章有关系。 我想用他们的评论加载帖子,但我想限制每个帖子只能得到3条评论。我怎样才能雄辩地做到这一点? 但是这个限制只会为所有10篇文章加载3条评论,而不是每个文章加载3条评论。 如果这还不可能通过Eloquent实现,是否有其他解决方案也可以实现即时加载? 谢谢

  • 很好的一天。我在我维护的代码中看到了这个片段。我试着去理解它的意思(比如我甚至需要向别人解释)。谁能帮助简化?代码如下所示。 这和说

  • 我们有以下几种型号- 邮递 使用者 媒体 集团 当我使用eloquent获取帖子时,我可以使用transform函数来转换帖子属性,但无法转换帖子集合中的关系。

  • 本文向大家介绍说说 Dubbo 服务暴露的过程。相关面试题,主要包含被问及说说 Dubbo 服务暴露的过程。时的应答技巧和注意事项,需要的朋友参考一下 Dubbo 会在 Spring 实例化完 bean 之后,在刷新容器最后一步发布 ContextRefreshEvent 事件的时候,通知实现了 ApplicationListener 的 ServiceBean 类进行回调 onApplicati