我正在尝试使用OWIN为本地Intranet上的Web API v2终结点实现OAuth。该API使用内置的Windows身份验证在IIS中托管。简而言之,这就是我要发生的事情。
当我在/token上要求我的 token 时
SQL表中的用户。
当我使用 token 从API请求资源时
角色
要求。它刚被放入JWT中。
我认为我已经正确设置了所有内容。我的Startup.Configuration方法看起来像这样。
public void Configuration(IAppBuilder app)
{
// token generation
// This is what drives the action when a client connects to the /token route
app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
{
// for demo purposes
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromHours(8),
AccessTokenFormat = GetMyJwtTokenFormat(),
Provider = new MyAuthorizationServerProvider()
});
//// token consumption
app.UseOAuthBearerAuthentication(
new OAuthBearerAuthenticationOptions()
{
Realm = "http://www.ccl.org",
Provider = new OAuthBearerAuthenticationProvider(),
AccessTokenFormat = GetMyJwtTokenFormat()
}
);
app.UseWebApi(WebApiConfig.Register());
}
MyAuthorizationServerProvider看起来像这样...
公共(public)类MyAuthorizationServerProvider:OAuthAuthorizationServerProvider
{
公共(public)重写异步任务GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext上下文)
{
//由于我是在启用Windows身份验证的IIS中托管
//我希望我的WindowsPrincipal在这里,但它为空:(
var windowsPrincipal = context.OwinContext.Request.User.Identity;
//WindowsPrincipal在此处为null。为什么?
//调用SQL获取该用户的角色
//使用角色创建身份
var id = new ClaimsIdentity(东西,更多东西);
context.Validated(id);
}
}
我的问题是context.Request.User在这里为null。我无法进入WindowsPrincipal。如果创建其他虚拟中间件,则可以毫无问题地进入WindowsPrincipal。为什么在这种情况下为null?难道我做错了什么?
最佳答案
交换UseOAuthAuthorizationServer和UseOAuthBearerAuthentication的顺序。 UseOAuthBearerAuthentication调用UseStageMarker(PipelineStage.Authenticate);
使它(及其之前的所有内容)在ASP.NET管道中更早地运行。在身份验证阶段运行时,用户为空。
关于iis - 在OWIN OAuthAuthorizationServerProvider中context.Request.User为null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25042740/