7

我发布这个是希望收到一些反馈/建议和关于我过去几天一直在努力的事情的信息。首先,我将简要介绍一下该项目。

解决方案中有 2 个应用程序:

  1. WebAPI 资源和授权服务器- 使用 OWIN(托管在 IIS 中)和 ASP.NET 身份在正确登录时发出身份验证令牌,然后允许对各种控制器的请求。

  2. MVC 客户端应用程序- 目前还没有授权(直到我弄清楚),但会调用 WebAPI 资源服务器以获取所有数据。这些调用只会通过客户端应用程序中控制器的操作进行,没有客户端 AJAX 调用。

客户端应用程序没有自己的数据源。所有信息都存储在 WebAPI 服务可以访问的数据库中,因此本质上,如果它们提供正确的凭据并且客户端应用程序接收到不记名令牌,我需要为应用程序提供一种将它们视为授权的方式。

  • 处理这个问题的最佳方法是什么?
  • 是否可以在客户端配置 OWIN 以使用服务器的 OAuth 设置?我是不是找错了树,我只需要使用 HTTPClients 吗?
  • 我可以反序列化承载令牌并将其存储在会话中,然后编写我自己的授权提供程序以在客户端检查这些吗?

我最初担心的是我在滥用不记名令牌并试图将它们拼凑成一个不理想的解决方案。到目前为止,我发现的所有外部授权示例通常都涉及调用由 Google/Facebook/Twitter 托管的提供商来检查用户是他们所说的身份,然后继续在他们的系统中创建用户记录。我的应用程序无法做到这一点。

关于安全性,我计划引入过滤器,通过提供标识符和秘密以及 IP 验证来验证请求是否来自客户端应用程序。

我意识到这可能有点开放,但我会很感激任何建议。该项目的范围是 Web 服务是唯一可以访问数据库的东西。MVC 客户端应用程序将托管在不同的服务器上,并且该服务将只接受来自所述客户端应用程序的请求。

4

2 回答 2

5

您无需访问 MVC 应用程序中的数据源即可验证不记名令牌。基本上,您可以通过以下方式进行操作,

  • 来自 webapi 的MVC 应用程序请求access_token并将其传递给 UI 客户端(假设是浏览器)。

  • 浏览器将 access_token 存储在 cookie/localstorage 中,并将它们发送到 MVC 应用程序以用于所有后续请求。

  • 在 MVC 应用程序中创建一个ActionFilter以验证来自浏览器的请求是否在标头中提供了令牌。如果不是,则拒绝该请求。

  • MVC 应用程序将标头中的 传递access_tokenAuthorizationwebapi。

  • 使用 HTTPS 进行所有通信(在 MVC 应用程序 <-> 客户端和 MVC 应用程序 <-> WebAPI 之间)

您可以进一步混淆或加密access_token您从 MVC 应用程序端的 WebAPI 获得的信息,以获得额外的安全性,但您必须将解密的版本发送回 WebAPI。

于 2015-01-12T09:36:21.017 回答
3

我意识到我的回答有点晚了,但也许它可以帮助其他人:

您从 API 获得的不记名令牌有一个加密的声明列表,只有 API 可以解密。我假设您也需要在 MVC 应用程序上拥有这些声明,以便您可以限制客户端上的资源。

所以,我所做的是首先获得令牌。获取后,再次向 API 资源 api/me/claims 发出请求,以获取客户端上的可读声明列表。基于此列表,您可以使用基于自定义声明的 Authorize 属性允许访问 MVC 客户端应用程序中的资源。此外,您可以将声明存储在客户端会话中的 cookie 中。下面是 API 控制器获取声明的代码。

[RoutePrefix("api/me/claims")]
public class ClaimsController : BaseApiController
{
    [Authorize]
    [Route("")]
    public IHttpActionResult GetClaims()
    {
        var identity = User.Identity as ClaimsIdentity;

        var claims = from c in identity.Claims
                     select new
                     {
                         subject = c.Subject.Name,
                         type = c.Type,
                         value = c.Value
                     };

        return Ok(claims);
    }
}

这个想法是在客户端重建登录用户的 ClaimsIdentity 对象,并可能将其添加到会话中。

令牌是不够的。您可能会冒着从 API 获得对您在 MVC 客户端应用程序中对用户可见的资源的未授权响应的风险。不用说,建议对所有请求使用 HTTPS。

于 2015-05-27T22:59:01.230 回答