如何在MVC 5 Web应用程序和Web API 2应用程序之间共享访问令牌

tea*_*ime 9 access-token jwt oauth2client asp.net-mvc-5 asp.net-web-api2

在这个例子中,我让用户登录到(MVC 5)Web应用程序,该应用程序然后充当代理以登录(Web API 2)API(使用基本的SSL)并返回承载/访问令牌.我正在使用Thinktecture.IdentityModel.Client.OAuth2Client来处理登录并获取访问令牌,这一切都正常.

其他一些事情发生但现在我希望Web应用程序能够解码访问令牌以访问API上的声明集(特别是登录API后返回的用户ID).

我正在使用带有令牌端点的大量演示UseOAuthAuthorizationServerUseOAuthBearerAuthentication扩展方法,几乎​​开箱即用,但有一个自定义OAuthAuthorizationServerOptions.Provider来访问我自己的存储库.

我在两个应用程序上都有相同的MachineKey,但我不清楚如何解码令牌,虽然我知道我可能不得不使用该SecureDataFormat.Unprotect方法.

我在Web应用程序中最接近的尝试是:

Task<TokenResponse> response = client.RequestResourceOwnerPasswordAsync(model.Email, model.Password);

IDataProtector dataProtecter = Startup.DataProtectionProvider.Create("does this matter?");
TicketDataFormat ticketDataFormat = new TicketDataFormat(dataProtecter);
AuthenticationTicket ticket = ticketDataFormat.Unprotect(response.Result.AccessToken);
Run Code Online (Sandbox Code Playgroud)

使用Startup.DataProtectionProvider设置如下:

public partial class Startup
{
    internal static IDataProtectionProvider DataProtectionProvider { get; private set; }

    public void Configuration(IAppBuilder app)
    {
        DataProtectionProvider = app.GetDataProtectionProvider();
        this.ConfigureAuth(app);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的后退计划是提供一种API方法,在登录后返回我感兴趣的信息,但看起来过多,因为它构成了令牌中声明的一部分(据我了解).

我试图绕过JWT(我看过Thinktecture,微软的源代码和各种其他论坛),但不确定这是否有帮助(尽管声明在纯文本中可用我们很有用).我还没有找到允许使用基本身份验证登录并返回包含访问令牌的自定义JWT的示例.

无论如何,我希望这些信息和任何帮助都会受到赞赏...欢呼

Sha*_*adi 1

如果您使用 UseOAuthBearerAuthentication,您可以在 Startup.Auth.cs 类上将 OAuthBearerOptions 设置为静态:

public partial class Startup
{
    public static OAuthBearerAuthenticationOptions OAuthBearerOptions { get; private set; }
    ...

    public void ConfigureAuth(IAppBuilder app)
    {
        // Configure the db context, user manager and signin manager to use a single instance per    request
        app.CreatePerOwinContext(ApplicationDbContext.Create);
        app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

        OAuthBearerOptions = new OAuthBearerAuthenticationOptions();
        app.UseOAuthBearerAuthentication(OAuthBearerOptions);
        ...

    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以从代码中的任何位置取消对收到的令牌的保护:

var ticket = Startup.OAuthBearerOptions.AccessTokenFormat.Unprotect(response.Result.AccessToken);
Run Code Online (Sandbox Code Playgroud)

现在您可以使用票证来访问 API 用户的声明:

ticket.Identity.Claims
Run Code Online (Sandbox Code Playgroud)

希望这能回答您的问题。

编辑

这个答案可以解决你的问题,请看一下。