将每个请求,基于令牌的身份验证添加到asp.net mvc站点

时间:2010-09-30 04:18:07

标签: asp.net asp.net-mvc-2 authentication

我有一个使用基本表单身份验证的现有asp.net mvc网站。该站点有一个登录页面,该页面回发到登录操作,该操作通过FormsAuthentication.SetAuthCookie()记录用户。我希望在网站上添加一个api,作为一个mvc2区域,用户将根据作为http头传递的令牌进行身份验证。此区域仅包含json操作,因此将用户重定向到登录页面没有意义。相反,我希望用户只需将令牌与每个请求一起传递。该令牌映射到每个用户帐户,用户将自动进行身份验证。

我在努力摆脱这种逻辑。此时,最佳选择似乎是在Application_AuthenticateRequest方法中将标头查找逻辑和身份验证添加到Global.asax。我想避免在调用FormsAuthentication.SetAuthCookie()之后需要重定向用户。我希望登录操作对他们透明。

我接近这个错误的方式吗?

作为旁注:不可能要求api请求的用户名/密码,因为该网站有多个用户。一些人使用OpenID加入,而其他人则使用用户名/密码加入。

2 个答案:

答案 0 :(得分:4)

向Global.asax中的Application_AuthenticateRequest事件添加标题查找。代码看起来像:

private const string AuthorizationHeader = "Authorization";

if (!string.IsNullOrWhiteSpace(request.Headers[AuthorizationHeader]))
{
  try
  {
    // Remove Basic from beginning and then decode the string
    var token = request.Headers[AuthorizationHeader].Substring(6);
    token = new ASCIIEncoding().GetString(Convert.FromBase64String(token)).Split(':')[0];

    return UserService.FetchByApiToken(token);
  }
  catch
  {
  }
}

答案 1 :(得分:1)