使用Auth标头(如webAPI)但在MVC中进行身份验证

时间:2016-06-07 15:28:47

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

好的,读这篇文章的人可能知道(就像我一样)WebAPI如何工作以及如何使用WebAPI和Identity框架构建应用程序我可以构建一个http请求,添加一个auth标头,应用程序将知道我是谁阅读auth标题。

这就是所谓的无状态" API调用,其中接收调用的API的所有内容都被赋予确定用户是谁以及因此可以对用户进行身份验证所需的一切,并且#34;无状态"行动他们的要求。

.....

我想在MVC(而不是Web API)中使用这种完全相同的行为。

我希望以前没有对此应用程序提出任何请求,我的应用程序使用Identity框架的方式与我的WebAPI端点完全相同,以确保每个"无状态"使用Authorization标头验证呼叫。

以下是我在WebAPI中的表现(它在MVC中不起作用)......

using Core.App.Security;
using Microsoft.Owin.Security.OAuth;
using Ninject;
using Owin;

namespace Core.App
{
    /// <summary>
    /// Setup as per ...
    /// Source code: https://github.com/tjoudeh/AngularJSAuthentication
    /// walkthrough: http://bitoftech.net/2014/09/24/decouple-owin-authorization-server-resource-server-oauth-2-0-web-api/
    /// </summary>
    public static class Auth
    {
        public static void Configure(IAppBuilder app, IKernel kernel)
        {
            // ensure that owin creates the required UserManager & sign in manager per owin instance
            app.CreatePerOwinContext<ApplicationUserManager>((options, owinContext) => ApplicationUserManager.Create(options, owinContext, kernel));
            app.CreatePerOwinContext<ApplicationSignInManager>((options, owinContext) => ApplicationSignInManager.Create(options, owinContext, kernel));

            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
            app.AddAuthInfoToContext();
        }
    }
}

本质上,这使用令牌设置bearer auth,但不在当前应用程序中设置auth服务器。

此代码允许作为我的Auth令牌提供程序的集中式SSO服务器可以发出我可以用于任何API应用程序的令牌(是的,我有很多)。

差异

WebAPI将在当前身份(HttpContext.Current.Identity)中拥有授权用户信息,并且不依赖于会话/以前的登录调用来创建会话信息。

MVC依赖会话和用户采取一种更传统的&#34; Forms Auth&#34;类型方法意味着我必须向本地MVC应用程序发出auth请求,以便&#34;登录&#34;在我关心的请求之前。

所以问题是

我怎样才能&#34;登录&#34;如果这是该用户在该会话中发出的第一个请求,其方式与WebAPI在使用上述代码与Identity框架时所执行的方式相同,那么在典型的http get请求中使用授权标头令牌?

1 个答案:

答案 0 :(得分:0)

使用auth标头中的令牌信息来检索用户并在管道的早期阶段将其放入当前标识(可能在授权阶段)

当我使用owin设置我的应用程序时,我可以轻松定义一个自定义中间件,以根据令牌信息将所需更改应用于当前身份。