两个不同的OWIN应用程序可以授权OAuth2载体访问令牌吗?

这个问题在这里已经有了答案:

  • 在多个服务中使用Oauth门票? 4个答案

  • 是的,您可以分离授权服务器和资源服务器。 他们可以住在不同的owin应用程序中,不仅如此,他们甚至可以住在不同的服务器上。

    授权服务器将负责向您的客户端应用程序颁发访问令牌,并最终管理用户和角色。

    资源服务器将托管受保护的资源,接受授权服务器释放的访问令牌。

    查看您的基础架构,您的Identity API将是授权服务器, 产品API将成为您的资源服务器。

    授权服务器需要配置和使用OAuthAuthorizationServerProvider的实现。
    在你的创业公司你会做这样的事情:

    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
    
    var OAuthOptions = new OAuthAuthorizationServerOptions
    {
        AllowInsecureHttp = true,
        TokenEndpointPath = new PathString("/oauth/Token"),
        AccessTokenExpireTimeSpan = TimeSpan.FromHours(8),
        Provider = new MyAuthorizationServerProvider(),
        // RefreshTokenProvider = new MyRefreshTokenProvider(DateTime.UtcNow.AddHours(8))
    };
    
    app.UseOAuthAuthorizationServer(OAuthOptions);
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
    

    正如你所看到的,我已经使用MyAuthorizationServerProvider作为认证的自定义提供者。

    它负责验证客户端( ValidateClientAuthentication )并授予访问资源的授权( GrantResourceOwnerCredentials )。

    GrantResourceOwnerCredentials将检查客户端(用户名和密码)的凭证是否有效并释放有效令牌:

    var ticket = new AuthenticationTicket(identity, props);
    context.Validated(ticket);
    

    AuthenticationTicket接收一个ClaimsIdentity对象和一个AuthenticationProperties集合。

    您通常会在此处添加用户名声明和角色:

    ClaimsIdentity identity = new ClaimsIdentity(context.Options.AuthenticationType);
    identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName));
    identity.AddClaim(new Claim(ClaimTypes.Role, "Users"));
    

    以及最终您可能想要使用的其他类型的声明。
    AuthenticationProperties集合将定义您想要传递给客户端的扩展信息:

    var props = new AuthenticationProperties(new Dictionary<string, string>
    {
        { 
        "name", "John"
        },
        { 
        "surname", "Smith"
        },
        { 
        "age", "40"
        },
        { 
        "gender", "Male"
        }
    });
    

    你可以检查这个github回购看看实现。

    您的资源服务器,负责管理您的业务信息的RESTful API将不必重新实现整个授权/认证层。

    在您的启动( 产品API )中,您只需指示api使用并消费持票人令牌:

    public void Configuration(IAppBuilder app)
    {
        HttpConfiguration config = new HttpConfiguration();
    
        OAuthBearerAuthenticationOptions OAuthBearerOptions = new OAuthBearerAuthenticationOptions();
        app.UseOAuthBearerAuthentication(OAuthBearerOptions);
    
        WebApiConfig.Register(config);
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        app.UseWebApi(config);
    }
    

    而你的受保护资源就是这样的:

    [Authorize(Roles = "Users")]
    public class ProductsController : ApiController
    {
        public Models.Product GetProduct(string id)
        {
            var identity = User.Identity as ClaimsIdentity;
    
            return new Models.Product();
        }
    }
    

    正如你所看到的,我已经使用了Authorize属性,因为我只想授权某种类型的用户。

    注意:

    如果要将授权服务器资源服务器托管到不同的计算机上,则必须确保在两台服务器上共享相同的machineKey ,否则资源服务器将无法解密由授权服务器释放的不记录令牌:

    <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
        <machineKey validationKey="VALUE GOES HERE" 
                    decryptionKey="VALUE GOES HERE" 
                    validation="SHA1" 
                    decryption="AES"/>
    </system.web>
    

    我建议你阅读这篇文章,以找到关于所涉及的所有部分的非常好的解释。

    Taisser也是另一篇文章,他使用Json Web Tokens来完成相同的过程,以达到相同的结果。

    链接地址: http://www.djcxy.com/p/22421.html

    上一篇: Can two different OWIN applications authorize an OAuth2 bearer access token?

    下一篇: SignalR authentication with webAPI Bearer Token