我继承了一个用.NET框架编写的代码,它使用System.Web.Http.AuthorizedAttribute进行身份验证。
public override void OnAuthorization(HttpActionContext actionContext)
{
// 1. Extract action context request header authorization for basic user name and password information
// 2. Validate this against the database.
// 3. If validated, call SetPrincipal() and IsAuthorized()
}
到目前为止,这种方法非常有效,每次对控制器的请求都将经过身份验证,然后控制器将进行工作以生成数据以在响应中发回。
好吧,我想使用JWT Token框架;我更喜欢使用.NET Core,但是由于此应用程序是在.NET框架中编写的,因此我需要使其与OnAuthorization一起使用。所以这是我的实现:
public override void OnAuthorization(HttpActionContext actionContext)
{
// 1. Extract action context request header authorization for basic user name and password information
// 2. Validate this against the database.
// 3. If validated, generate a JWT Token.
// 4. put this token in the response's cookie to send back to the client.
}
现在,当我在OnAuthorization()中设置响应cookie时,它将立即将带有cookie的请求返回给客户端。
问题是客户端现在必须发出两个单独的请求,一个要进行身份验证以从我那里获取JWT令牌,然后在下一个请求中使用该令牌。如何在一个请求中进行身份验证,获取令牌,在控制器中处理该请求,然后为JWT令牌设置cookie?
我在OnAuthorization中设置cookie的代码如下:
var cookie = new CookieHeaderValue("jwtToken", generatedToken);
cookie.Expires = DateTimeOffset.Now.AddDays(1);
cookie.Domain = actionContext.Request.RequestUri.Host;
actionContext.Response = new HttpResponseMessage(HttpStatusCode.OK);
actionContext.Response.Headers.AddCookies(new CookieHeaderValue[] { cookie });
您能指出我正确的方法吗?我应该在哪里设置Cookie?我在OnAuthorization()中执行此操作,因为这是我调用可乐以验证并生成JWT令牌的地方。
答案 0 :(得分:0)
我不确定我是否理解此问题,但理想情况下不应覆盖OnAuthorization。而是应重写由OnAuthorization调用的IsAuthorized方法。检查下面的OnAuthorization实施。
public override void OnAuthorization(HttpActionContext actionContext)
{
if (actionContext == null)
{
throw Error.ArgumentNull("actionContext");
}
if (SkipAuthorization(actionContext))
{
return;
}
if (!IsAuthorized(actionContext))
{
HandleUnauthorizedRequest(actionContext);
}
}