我们如何在使用用户名和密码流的ASP.NET 5中使用承载令牌?对于我们的方案,我们希望让用户使用AJAX调用进行注册和登录,而无需使用外部登录。
为此,我们需要一个授权服务器端点。 在ASP.NET的早期版本中, 我们将执行以下操作,然后登录ourdomain.com/TokenURL。
ourdomain.com/Token
// Configure the application for OAuth based flow PublicClientId = "self"; OAuthOptions = new OAuthAuthorizationServerOptions { TokenEndpointPath = new PathString("/Token"), Provider = new ApplicationOAuthProvider(PublicClientId), AccessTokenExpireTimeSpan = TimeSpan.FromDays(14) };
但是,在当前版本的ASP.NET中,上述方法不起作用。我们一直在尝试找出新方法。例如,GitHub上的aspnet / identity示例配置了Facebook,Google和Twitter身份验证,但似乎没有配置非外部OAuth授权服务器终结点,除非这样做是AddDefaultTokenProviders()那样,在这种情况下,我们想知道提供者将是。
AddDefaultTokenProviders()
通过阅读本文的源代码,我们了解到可以通过调用类将“承载者身份验证中间件”添加到HTTP管道IAppBuilder.UseOAuthBearerAuthentication中Startup。尽管我们仍不确定如何设置其令牌端点,但这是一个好的开始。这不起作用:
IAppBuilder.UseOAuthBearerAuthentication
Startup
public void Configure(IApplicationBuilder app) { app.UseOAuthBearerAuthentication(options => { options.MetadataAddress = "meta"; }); // if this isn't here, we just get a 404 app.Run(async context => { await context.Response.WriteAsync("Hello World."); }); }
前往后,ourdomain.com/meta我们会收到您好的世界页面。
ourdomain.com/meta
进一步的研究表明,我们也可以使用IAppBuilder.UseOAuthAuthentication扩展方法,并且它需要一个OAuthAuthenticationOptions参数。该参数具有TokenEndpoint属性。因此,尽管我们不确定自己在做什么,我们还是尝试了一下,但那当然是行不通的。
IAppBuilder.UseOAuthAuthentication
OAuthAuthenticationOptions
TokenEndpoint
public void Configure(IApplicationBuilder app) { app.UseOAuthAuthentication("What is this?", options => { options.TokenEndpoint = "/token"; options.AuthorizationEndpoint = "/oauth"; options.ClientId = "What is this?"; options.ClientSecret = "What is this?"; options.SignInScheme = "What is this?"; options.AutomaticAuthentication = true; }); // if this isn't here, we just get a 404 app.Run(async context => { await context.Response.WriteAsync("Hello World."); }); }
换句话说,转到时ourdomain.com/token,没有错误,仅是我们的hello world页面。
ourdomain.com/token
好的,让我们回顾一下 OWIN / Katana 3*IAppBuilder提供的不同的OAuth2中间件(及其各自的扩展)以及将要移植到 ASP.NET Core的 中间件: ***
IAppBuilder
app.UseOAuthBearerAuthentication
OAuthBearerAuthenticationMiddleware
注意:从ASP.NET Core beta8开始,它现在命名为app.UseJwtBearerAuthentication/JwtBearerAuthenticationMiddleware。
app.UseJwtBearerAuthentication
JwtBearerAuthenticationMiddleware
app.UseOAuthAuthorizationServer/ OAuthAuthorizationServerMiddleware:顾名思义,它OAuthAuthorizationServerMiddleware是OAuth2授权服务器中间件,用于创建和颁发访问令牌。 该中间件不会移植到ASP.NET Core : ASP.NET Core中的 OAuth授权服务。
app.UseOAuthAuthorizationServer
OAuthAuthorizationServerMiddleware
app.UseOAuthBearerTokens:这个扩展实际上并不对应于中间件,只是app.UseOAuthAuthorizationServer和app.UseOAuthBearerAuthentication。它是ASP.NET Identity程序包的一部分,并且是配置OAuth2授权服务器和OAuth2承载中间件的一种简便方法,该中间件用于在单个调用中验证访问令牌。 不会移植到ASP.NET Core中 。
app.UseOAuthBearerTokens
ASP.NET Core将提供一个全新的中间件(我很自豪地说我设计了它):
app.UseOAuthAuthentication
OAuthAuthenticationMiddleware
app.UseFacebookAuthentication
app.UseGoogleAuthentication
因此,您实际上正在寻找的中间件是 OAuth2授权服务器中间件 aka OAuthAuthorizationServerMiddleware。
尽管它被社区的大部分人视为必不可少的组件,但它不会移植到ASP.NET Core中 。
幸运的是,已经有直接替换: AspNet.Security.OpenIdConnect.Server (https://github.com/aspnet- contrib/AspNet.Security.OpenIdConnect.Server)
该中间件是 Katana 3 随附的OAuth2授权服务器中间件的高级分支,但其目标是 OpenID Connect (其本身基于OAuth2)。它使用相同的低级方法(通过各种通知)提供细粒度的控制,并允许您使用自己的框架(Nancy,ASP.NET Core MVC)来为您的授权页面提供服务,就像使用OAuth2服务器中间件一样。配置起来很容易:
ASP.NET Core 1.x:
// Add a new middleware validating access tokens issued by the server. app.UseOAuthValidation(); // Add a new middleware issuing tokens. app.UseOpenIdConnectServer(options => { options.TokenEndpointPath = "/connect/token"; // Create your own `OpenIdConnectServerProvider` and override // ValidateTokenRequest/HandleTokenRequest to support the resource // owner password flow exactly like you did with the OAuth2 middleware. options.Provider = new AuthorizationProvider(); });
ASP.NET Core 2.x:
// Add a new middleware validating access tokens issued by the server. services.AddAuthentication() .AddOAuthValidation() // Add a new middleware issuing tokens. .AddOpenIdConnectServer(options => { options.TokenEndpointPath = "/connect/token"; // Create your own `OpenIdConnectServerProvider` and override // ValidateTokenRequest/HandleTokenRequest to support the resource // owner password flow exactly like you did with the OAuth2 middleware. options.Provider = new AuthorizationProvider(); });
有一个 OWIN / Katana 3 版本,和一个同时支持.NET Desktop和.NET Core 的 ASP.NET Core 版本。
请毫不犹豫地尝试给邮递员示例以了解其工作原理。 我建议阅读 相关的博客文章,该文章说明了如何实现资源所有者密码流。
如果您仍然需要帮助,请随时与我联系。祝好运!