使用类似WebAPI的身份验证头进行身份验证,但在MVC中。

4

如果您正在阅读这篇文章,那么很可能了解WebAPI的工作原理,以及如果使用WebAPI和Identity框架构建应用程序,则可以构建一个HTTP请求,添加身份验证标头,应用程序将通过读取身份验证标头来知道我是谁。

这就是所谓的“无状态”API调用,其中API接收到的所有内容均被提供给它以确定用户是谁,并且因此可以对用户进行身份验证并“无状态”地执行其请求。

.....

我希望在MVC中实现完全相同的行为(而不是Web API)。

我想在先前没有向此应用程序进行任何请求的情况下,让我的应用程序以与我的WebAPI端点完全相同的方式使用Identity框架,以确保每个“无状态”调用都使用授权标头进行身份验证。

以下是如何在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();
        }
    }
}

基本上,这将使用令牌设置承载者认证,但不需要当前应用程序中的认证服务器。

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

差异

WebAPI在当前标识(HttpContext.Current.Identity)中具有经过授权的用户信息,并且不依赖于会话/先前的登录调用来创建会话信息。

MVC依赖会话和用户采用更传统的“表单Auth”类型方法,这意味着我必须向本地MVC应用程序发出认证请求以“登录”,然后再请求我关心的内容。

所以问题是

当这是该用户在同一会话中进行的第一个请求时,如何使用授权标头令牌“登录”常规http get请求,就像WebAPI在使用Identity框架时执行的操作一样?


1
你如何期望在用户使用<a>标签导航时,从Web浏览器发送Authorization头?令牌授权头只能通过AJAX或应用程序客户端工作,这就是为什么MVC传统上使用cookie的原因(请注意,这与有状态的cookie身份验证不相等,cookie身份验证可以像令牌身份验证一样无状态)。 - Federico Dipuma
@FedericoDipuma 这是针对我完全控制请求构建的情况。 我不想在这里进行有关有状态与无状态的辩论,因为已经有很多相关问题了。事实是,我没有 cookie,而是有一个身份验证令牌,并且我想使用它来发起一个无状态调用到一个 MVC 应用程序。 - War
1个回答

0

使用身份验证标头中的令牌信息检索用户,并在管道的早期阶段(可能是在身份验证阶段期间)将其放入当前标识中。

由于我正在使用owin来设置我的应用程序,因此可以轻松定义一段自定义中间件来根据令牌信息应用所需的更改到当前标识中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接