【问题标题】:Add per request, token based authentication to asp.net mvc site将每个请求、基于令牌的身份验证添加到 asp.net mvc 站点
【发布时间】:2010-09-30 04:18:06
【问题描述】:

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

我正在努力将这个逻辑放在哪里。此时,最好的选择似乎是将标头查找逻辑和身份验证添加到 Application_AuthenticateRequest 方法中的 Global.asax。不过,我想避免在调用 FormsAuthentication.SetAuthCookie() 后重定向用户。我希望登录操作对他们透明。

我是不是走错了路?

附带说明:由于该站点有多种用户,因此无法为 api 请求提供用户名/密码。一些人使用 OpenID 加入,而其他人则使用用户名/密码加入。

【问题讨论】:

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


    【解决方案1】:

    在 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
      {
      }
    }
    

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 不幸的是,我没有使用 WCF,老实说......我不想。它看起来像一个过度架构的混乱,很可能会在 1-2 年内被其他东西取代......该网站不是企业,不需要那种复杂程度
      • 哦,我感觉你 100% 都在深入其中一个企业项目。但是 WCF 休息服务的故事是相当干净的。在我通过判断之前,我会先看看入门套件。
      • Web API 已作为提供 REST 服务的新方式出现。看起来 WCF 已被预测超过。确实为问题域过度设计了(并不是说它没有非常有效的场景)。 :)
      猜你喜欢
      • 2021-11-13
      • 2015-01-27
      • 2020-01-23
      • 2015-05-16
      • 2017-09-13
      • 2014-06-27
      • 2017-03-21
      • 1970-01-01
      • 2016-06-09
      相关资源
      最近更新 更多