【发布时间】:2015-10-30 15:53:00
【问题描述】:
使用 Web Api 2.2,我有一个自定义 IAuthenticationFilter,用于通过自定义方案对客户端请求进行身份验证。
基本上,当客户端未通过身份验证并想要访问受保护的资源时,他会在请求旁边发送一个Authorization 标头:Authorization: MyCustomScheme 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);
}
然后它失败了,因为context.ActionContext.Response 为空。如何将 cookie 添加到来自 AuthenticateAsync 的响应中?
查看相关:Setting Cookie values in HttpAuthenticationContext for IAuthenticationFilter (您可以在 cmets 中看到人们遇到同样的问题)。
【问题讨论】:
标签: c# authentication cookies asp.net-web-api2