如果您正在阅读这篇文章,那么很可能了解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框架时执行的操作一样?
<a>
标签导航时,从Web浏览器发送Authorization
头?令牌授权头只能通过AJAX或应用程序客户端工作,这就是为什么MVC传统上使用cookie的原因(请注意,这与有状态的cookie身份验证不相等,cookie身份验证可以像令牌身份验证一样无状态)。 - Federico Dipuma