区分第一个请求(身份验证)和后续请求(也是身份验证)

时间:2014-01-21 11:10:17

标签: authentication asp.net-web-api token basic-authentication

使用基本身份验证我在我的身份验证处理程序中执行此操作:

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
    var authHeader = request.Headers.Authorization;
    if (authHeader == null || authHeader.Scheme != BasicScheme)
    {
        return CreateUnauthorizedResponse();
    }

    // Now authenticate the user with his name+pw

    // Return Auth token to user

}

每次这意味着第一个请求或所有后续的重新命令,用户请求将通过上述SendAsnyc方法。我应该如何区分上述方法,用户是否需要第一次验证自己(有用户名+密码)或者进一步验证自己(拥有服务器生成的身份验证令牌)?

2 个答案:

答案 0 :(得分:0)

您可以使用授权方案进行区分。当用户发送用户名/密码时,请使用&#34; basic&#34;身份验证计划。发送令牌时,请使用&#34; bearer&#34;身份验证计划。

答案 1 :(得分:0)

两个选项。

(1)假设在成功验证用户名/密码后从服务器发回的令牌在Authorization标头中发送以用于后续请求(在不同的方案中),重新排列您的逻辑以便您在授权头中查找基本方案,如果存在,则验证并发回令牌。如果不存在具有基本方案的authz头但是您的方案或承载方案(无论是什么)存在,则假设它是令牌和验证。如果authz标头不存在或基本方案中的凭据无效或其他方案中的标记无效,请发送401。

(2)更改消息处理程序,使其仅执行基本方案身份验证。如果标头不存在或凭据无效或存在,则它不会在request.GetRequestContext().Principal中设置正确的主体,但不会发送回401.引入另一个将执行令牌认证的消息处理程序。仅当请求中存在令牌且令牌有效时,此处理程序才设置正确的主体。同样,此处理程序不会发回401.最后,在操作方法,控制器甚至全局应用Authorize过滤器。如果两个消息处理程序都没有建立经过身份验证的身份,则Filter会将响应状态设置为401。

我更喜欢第二个,因为处理程序具有单一的身份验证责任。顺便说一句,通常不建议使用消息处理程序进行身份验证。一旦执行返回到IIS管道(假设您使用IIS),您在此处建立的身份将被还原。