【问题标题】:Token Based Authorization Web API基于令牌的授权 Web API
【发布时间】:2013-10-28 14:44:13
【问题描述】:

我正在使用backbone.js 和web api 构建一个应用程序。 JS 客户端会发送 ajax 请求来访问 api。构建 API 非常简单,但我想实现 API 的身份验证和授权。

我计划在成功验证后返回一个令牌,并将此令牌用于进一步的请求。此令牌将在 HTTP 授权标头中传递。 我的要求如下 1) 验证每个请求的令牌并获取用户 ID。 2) 使用获取的用户 ID 进行进一步操作。

可以使用自定义操作过滤器处理第一位,其中可以根据数据库验证永久令牌。 但我找不到任何样本或例子来做第二次。我想从传递的令牌中获取用户 ID 并将其进一步携带以供以后处理。 有什么办法吗?

等待建议或想法。任何代码示例都会有帮助。提前致谢。

【问题讨论】:

标签: c# asp.net-web-api


【解决方案1】:

您可以在成功验证令牌后设置Thread.CurrentPrincipal,如下所示:

IPrincipal principal = new GenericPrincipal(new GenericIdentity(username), null);

Thread.CurrentPrincipal = principal;
// if we're running in IIS...
if ( HttpContext.Current != null )
    HttpContext.Current.User = principal;

主体也可能是实现 System.Security.Principal.IPrincipal 接口的自定义类的实例(以便能够关联其用户 ID)。

我进一步建议您使用DelegatingHandler 而不是操作过滤器进行令牌验证,以便在消息生命周期中尽早设置当前主体。此外,这样您就不必使用操作过滤器属性来装饰每个操作方法/控制器。

【讨论】:

【解决方案2】:

我强烈建议使用 OAuth。无论如何,您可以在会话中设置令牌和用户信息,并在后续调用中使用它们。即,如果会话处于活动状态且用户信息存在,则使用它们,否则授权和验证用户(可能通过 OAuth),如果有效,则将它们存储在会话中以供后续调用使用。

【讨论】:

  • 他为什么要使用 OAuth,这与这个问题有什么关系?只是放弃这样的名字,没有任何进一步的理由,为什么真的对任何人都没有帮助。