我正在尝试使用OWIN为本地Intranet上的Web API v2终结点实现OAuth。该API使用内置的Windows身份验证在IIS中托管。简而言之,这就是我要发生的事情。

当我在/token上要求我的 token 时

  • 将WindowsPrincipal从OWIN上下文中拉出
  • 使用WindowsPrincipal中的SID来为此查找一些角色
    SQL表中的用户。
  • 创建一个新的ClaimsIdentity,用于存储用户名和角色
  • 将其转换为我发送给bak
  • 的Json Web token (JWT)

    当我使用 token 从API请求资源时
  • 将JWT Bearer token 转换回ClaimsIdentity
  • 使用ClaimsIdentity通过以下方式授权对资源的请求
    角色
  • 这样,我不必为每个角色上的用户角色进行数据库查找
    要求。它刚被放入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/

    10-10 15:17