gpt4 book ai didi

c# - 从 Web Api 2 IAuthenticationFilter AuthenticateAsync 方法设置 cookie

转载 作者:行者123 更新时间:2023-11-30 16:06:42 28 4
gpt4 key购买 nike

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

基本上,当客户端未通过身份验证并想要访问 protected 资源时,他会发送一个 Authorization header :Authorization: MyCustomScheme XXXXXXX 连同请求。然后过滤器验证凭据,对用户进行身份验证并生成无状态身份验证 token 以供进一步访问(类似于 JWT )。

我想将生成的身份验证 token 存储在 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);
}

然后失败,因为 context.ActionContext.Response 为 null。如何将 cookie 添加到 AuthenticateAsync 中的响应?

参见相关:Setting Cookie values in HttpAuthenticationContext for IAuthenticationFilter(您可以在评论中看到人们遇到同样的问题)。

最佳答案

我的要求是添加一个 header ,但应该很容易适应添加 cookie。

我对此采取了不同的方法。我将要添加的 header 放入 context.Request.Properties 中。然后在 ChallengeAsync 中(无论每个请求都会调用它)通过 IHttpActionResult 我检查该属性是否存在,如果存在则将其添加到 header 中。像这样:

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);

}

关于c# - 从 Web Api 2 IAuthenticationFilter AuthenticateAsync 方法设置 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31873720/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com