手动交付令牌(除了owin配置方式之外)

时间:2019-06-13 15:55:32

标签: asp.net asp.net-web-api oauth-2.0 owin

我实际上有一个asp.net网站应用程序,可以通过以下方式将令牌传递给用户:

  1. 用户登录到应用程序,转到特定页面并获取一个clientid和一个clientsecret。
  2. 然后,他通过提供clientid和clientsecret(客户端凭据授予类型)来获取令牌,从而将以下api称为“ .... api / token”。

这是相关的代码:

using Microsoft.Owin;
using Owin;
using System;
using Microsoft.Owin.Security.OAuth;

[assembly: OwinStartup(typeof(MyApp.Web.App_Start.OwinStartup))]

namespace MyApp.Web.App_Start
{
    public class OwinStartup
    {
        public void Configuration(IAppBuilder app)
        {
            OwinWebApiStartup.Configuration(app);            
        }
    }
}

public static class OwinWebApiStartup
{
    public static void Configuration(IAppBuilder app)
    {
        var provider = //my provider implementation;
        var oauthServerOptions = new OAuthAuthorizationServerOptions
        {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/api/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(20),
            Provider = provider,
        };

        app.UseOAuthAuthorizationServer(oauthServerOptions);
        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
        {
            AccessTokenProvider = //my provider implementation,
        });
   }
}

这很好。但是我想添加一个新功能,其中的javascript客户端代码(不再是用户)想要调用我的api,因此它将需要具有令牌,但没有clientid和clientsecret。 这是我的想法:

创建一个新的api端点,(我的javascript客户端代码中只有此端点可以访问,而没有令牌,并且在那里,代码将生成一个令牌(由于所连接的当前用户的用户名),并返回该令牌(将 与用户可以使用现有方法获得的相同)将由javascript客户端代码使用

1 个答案:

答案 0 :(得分:0)

我过去曾遇到过这个问题。我通过querystring解决了这个问题,因为owin只能提供一个令牌资源。实际上,依靠owin而不执行自己的代码是很有意义的。

我的伪解决方案:

KeyValuePair<string, string[]> typePair = ctx.Request.Query.FirstOrDefault(x => x.Key == "type");
LoginType? loginType = GetLoginType(typePair);
[...]
switch (loginType)
        {
            case LoginType.User:
            [...]
            ////within this routine you could set your claims depending on your needs

如果您有其他解决方案,我将非常感谢您分享