两个不同的OWIN应用程序可以授权OAuth2载体访问令牌吗?
这个问题在这里已经有了答案:
是的,您可以分离授权服务器和资源服务器。 他们可以住在不同的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?