使用基本身份验证我在我的身份验证处理程序中执行此操作:
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方法。我应该如何区分上述方法,用户是否需要第一次验证自己(有用户名+密码)或者进一步验证自己(拥有服务器生成的身份验证令牌)?
答案 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),您在此处建立的身份将被还原。