当前位置: 首页 > 知识库问答 >
问题:

使用WebApi中的OAuth承载令牌生成和Owin向客户端返回更多信息

颜修明
2023-03-14

我已经创建了一个WebApi和一个Cordova应用程序。我正在使用HTTP请求在Cordova应用程序和WebAPI之间进行通信。在WebAPI中,我实现了OAuth承载令牌的生成。

public void ConfigureOAuth(IAppBuilder app)
    {
        var oAuthServerOptions = new OAuthAuthorizationServerOptions
        {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
            Provider = new SimpleAuthorizationServerProvider(new UserService(new Repository<User>(new RabbitApiObjectContext()), new EncryptionService()))
        };

        // Token Generation
        app.UseOAuthAuthorizationServer(oAuthServerOptions);
        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

    }

这在SimpleAuthorizationServerProvider实现中

 public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
       context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

        // A little hack. context.UserName contains the email
        var user = await _userService.GetUserByEmailAndPassword(context.UserName, context.Password);

        if (user == null)
        {
            context.SetError("invalid_grant", "Wrong email or password.");
            return;
        }

        var identity = new ClaimsIdentity(context.Options.AuthenticationType);
        identity.AddClaim(new Claim("sub", context.UserName));
        identity.AddClaim(new Claim("role", "user"));

        context.Validated(identity);
    }

在Cordova应用程序成功地向API发出登录请求后,我会收到以下JSON

{"access_token":"some token","token_type":"bearer","expires_in":86399}

问题是,我需要更多关于用户的信息。例如,我在数据库中有一个UserGuid字段,我想在登录成功时将其发送给Cordova应用程序,并在以后的其他请求中使用它。除了“access_token”、“token_type”“expires_in”之外,我是否可以包含其他要返回到客户端的信息?如果不是,我如何根据access_token在API中获取用户?

编辑:

我想我找到了解决办法。我在GrantResourceOwnerCredentials中添加了以下代码

identity.AddClaim(new Claim(ClaimTypes.Name, user.UserGuid.ToString()));

然后,我访问控制器中的GUID,如下所示:user.identity.name

我还可以添加具有自定义名称标识的guid。AddClaim(new Claim(“guid”,user.userguid.ToString()));

我仍然有兴趣知道是否有一种方法可以使用承载令牌JSON向客户机返回更多的数据。

共有1个答案

乔俊才
2023-03-14

您可以根据需要添加任意多个声明。
您可以从System.Security.claims添加标准声明集,也可以创建自己的声明集。
声明将在令牌中加密,因此只能从资源服务器访问它们。

如果您希望您的客户机能够读取令牌的扩展属性,则可以使用另一个选项:authenticationproperties

假设您想添加一些内容,以便您的客户可以访问。这是应该走的路:

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

现在您可以使用上面添加的属性创建票据:

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

这就是您的客户将获得的结果:

.expires: "Tue, 14 Oct 2014 20:42:52 GMT"
.issued: "Tue, 14 Oct 2014 20:12:52 GMT"
access_token: "blahblahblah"
expires_in: 1799
age: "20"
gender: "Male"
surname: "Smith"
token_type: "bearer"

另一方面,如果添加声明,则可以在API控制器的资源服务器中读取它们:

public IHttpActionResult Get()
{
    ClaimsPrincipal principal = Request.GetRequestContext().Principal as ClaimsPrincipal;

    return Ok();
}

您的ClaimspRincipal将包含您在此处添加的新声明的GUID

identity.AddClaim(new Claim("guid", user.UserGuid.ToString()));

如果您想了解owin、承载令牌和web api的更多信息,这里有一个非常好的教程,本文将帮助您掌握授权服务器和资源服务器背后的所有概念。

更新:

你可以在这里找到一个工作的例子。这是一个Web Api+Owin自托管。
这里不涉及数据库。客户端是一个控制台应用程序(还有一个html+JavaScript示例),它调用一个传递凭据的Web Api。

正如Taiseer所建议的,您需要重写tokenendpoint:

public override Task TokenEndpoint(OAuthTokenEndpointContext context)
{
    foreach (KeyValuePair<string, string> property in context.Properties.Dictionary)
    {
        context.AdditionalResponseParameters.Add(property.Key, property.Value);
    }

    return Task.FromResult<object>(null);
}

从Solution->Properties中启用“Multiple Startup Projects”,您就可以直接运行它。

 类似资料:
  • 问题内容: 我想创建一个使用asp.net mvc webapi作为后端和客户端路由(没有cshtml)的SPA angularjs应用程序中的身份验证和授权的示例。以下只是可用于设置完整示例的函数示例。但是我不能一概而论。任何帮助表示赞赏。 问题: 最佳实践是什么:基于Cookie或令牌? 如何创建有角度的承载令牌以对每个请求进行授权? 验证API函数? 如何在客户端上保留登录的登录用户? 示例

  • 我有一个Keycloak(独立)V1.9.4。最后在AWS实例上使用Wildfly 10安装安装程序,并尝试使用Keycloak(通过Keycloak的登录页面)和Twitter4j来验证Twitter用户,然后明显地让我的应用程序验证并查看用户的时间线等。 我已经配置了身份提供程序(Twitter)、领域和我的客户端应用程序。 我还在apps.Twitter.com上设置了一个Twitter应用

  • 问题内容: 我试图使用Java中的Apache OAuth Client 2.0 Library自动执行用户级别令牌创建/生成过程(REST /授权授予代码)。以下是我从https://cwiki.apache.org/confluence/display/OLTU/OAuth+2.0+Client+Quickstart获得的正在使用的代码, 但是,我在以下几行中收到了(来自Eclipse中错误的

  • 问题内容: 我正在使用Apache Oltu框架实现OAuth 2.0提供程序服务器,以寻找有关如何在Java中生成访问令牌和秘密令牌的想法。请指教。 问题答案: OAuth 2.0 规范并未说明如何生成令牌和秘密令牌。因此,由您决定是使用一些现有的/锚定数据来生成令牌,还是要使用随机序列来生成令牌。唯一的区别是,如果您使用大概已知的数据(例如,用户数据,例如用户名,创建日期等),则可以在需要时随

  • 我想在SPA angularjs应用程序中创建一个身份验证和授权的示例,使用asp.netmvc webapi作为后端和客户端路由(没有cshtml)。下面只是可以用来设置完整示例的函数示例。但我就是不能把它们放在一起。任何帮助赞赏。 问题: 最佳实践是什么:基于Cookie还是基于令牌 如何在angular中创建承载令牌以在每次请求时进行授权 API函数的验证 如何在客户端上保留已登录用户的身份

  • 我正在尝试从RESTAPI获取数据,他们还没有完全实现OAuth。他们只使用OAuth在您已经拥有访问令牌后使用的签名方法。我已获得消费者密钥 你能建议怎么做吗?