gpt4 book ai didi

iis - OWIN OAuthAuthorizationServerProvider 中的 context.Request.User 为空

转载 作者:行者123 更新时间:2023-12-04 16:44:01 25 4
gpt4 key购买 nike

我正在尝试使用 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 Auth 的 IIS 中托管
    //我希望我的 WindowsPrincipal 在这里,但它是空的 :(
    var windowsPrincipal = context.OwinContext.Request.User.Identity;

    //windowsPrincipal 在这里为空。为什么?

    //调用 SQL 获取该用户的角色

    //使用角色创建身份
    var id = new ClaimsIdentity(stuff, more stuff);

    context.Validated(id);
    }
    }

    我的问题是 context.Request.User 在这里为空。我无法访问我的 WindowsPrincipal。如果我创建一些其他虚拟中间件,我可以毫无问题地访问 WindowsPrincipal。为什么在这种情况下它为空?难道我做错了什么?

    最佳答案

    交换 UseOAuthAuthorizationServer 和 UseOAuthBearerAuthentication 的顺序。使用OAuthBearerAuthentication 调用UseStageMarker(PipelineStage.Authenticate);使其(以及之前的所有内容)在 ASP.NET 管道中更早地运行。在 Authenticate 阶段运行时,用户为 null。

    关于iis - OWIN OAuthAuthorizationServerProvider 中的 context.Request.User 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25042740/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com