一尘不染

配置授权服务器端点

c#

我们如何在使用用户名和密码流的ASP.NET 5中使用承载令牌?对于我们的方案,我们希望让用户使用AJAX调用进行注册和登录,而无需使用外部登录。

为此,我们需要一个授权服务器端点。 在ASP.NET的早期版本中, 我们将执行以下操作,然后登录ourdomain.com/TokenURL。

// 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()那样,在这种情况下,我们想知道提供者将是。

研究

通过阅读本文的源代码,我们了解到可以通过调用类将“承载者身份验证中间件”添加到HTTP管道IAppBuilder.UseOAuthBearerAuthenticationStartup。尽管我们仍不确定如何设置其令牌端点,但这是一个好的开始。这不起作用:

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我们会收到您好的世界页面。

进一步的研究表明,我们也可以使用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页面。


阅读 389

收藏
2020-05-19

共1个答案

一尘不染

好的,让我们回顾一下 OWIN / Katana 3*IAppBuilder提供的不同的OAuth2中间件(及其各自的扩展)以及将要移植到
ASP.NET Core的 中间件:
***

  • app.UseOAuthBearerAuthentication/ OAuthBearerAuthenticationMiddleware:它的名字并不是很明显,但是它(并且仍然是,因为已经移植到ASP.NET Core中)负责验证由OAuth2服务器中间件发出的访问令牌。它基本上是cookie中间件的 令牌对应物 ,用于保护您的API。 在ASP.NET Core中,它增加了可选的OpenID Connect功能 (现在它能够从颁发令牌的OpenID Connect服务器自动检索签名证书)。

注意:从ASP.NET Core
beta8开始,它现在命名为app.UseJwtBearerAuthentication/JwtBearerAuthenticationMiddleware

  • app.UseOAuthAuthorizationServer/ OAuthAuthorizationServerMiddleware:顾名思义,它OAuthAuthorizationServerMiddleware是OAuth2授权服务器中间件,用于创建和颁发访问令牌。 该中间件不会移植到ASP.NET CoreASP.NET Core中的 OAuth授权服务

  • app.UseOAuthBearerTokens:这个扩展实际上并不对应于中间件,只是app.UseOAuthAuthorizationServerapp.UseOAuthBearerAuthentication。它是ASP.NET Identity程序包的一部分,并且是配置OAuth2授权服务器和OAuth2承载中间件的一种简便方法,该中间件用于在单个调用中验证访问令牌。 不会移植到ASP.NET Core中

ASP.NET Core将提供一个全新的中间件(我很自豪地说我设计了它):

  • app.UseOAuthAuthentication/ OAuthAuthenticationMiddleware:此新的中间件是一个通用的OAuth2交互式客户端,其行为完全相同app.UseFacebookAuthenticationapp.UseGoogleAuthentication几乎支持任何标准的OAuth2提供程序,包括您的OAuth2提供程序。Google,Facebook和Microsoft提供程序都已更新,可以从此新的基本中间件继承。

因此,您实际上正在寻找的中间件是 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
版本。

请毫不犹豫地尝试给邮递员示例以了解其工作原理。
我建议阅读 相关的博客文章,该文章说明了如何实现资源所有者密码流。

如果您仍然需要帮助,请随时与我联系。祝好运!

2020-05-19