在AuthorizedAttribute的OnAuthentication

时间:2019-01-07 14:35:00

标签: c# .net

我继承了一个用.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令牌的地方。

1 个答案:

答案 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);
    }
}