【问题标题】:.NET Identity: Generate token without explicit username / password.NET 身份:在没有明确用户名/密码的情况下生成令牌
【发布时间】:2016-09-01 22:14:07
【问题描述】:

我有一个配置为使用 ASP.NET 标识的 MVC 应用程序。更具体地说,我已将应用程序配置为使用 OAuth。一切都按原样完美运行。我可以将用户名/密码传递给我的令牌端点并接收一个令牌作为回报。我已经配置了刷新令牌,我剥离了默认声明并添加了我自己的、实现的授权属性等。

我有一个基于非用户名/密码组合生成令牌的新要求。这种组合在高层次上类似于用户名/密码:用户传递了两条关于他们自己的信息,如果为真,则返回一个 JWT(就像使用用户名/密码一样)。

假设我有一个 Person 和 AspNetUser 表。一些个人记录将是 AspNetUser,但不是全部。那些不想使用我上面描述的方法进行身份验证的人。我想,从技术上讲,它们可以是 AspNetUser 记录,但没有配置密码和可能的电子邮件。

我很难找到合适的解决方案来解决这个问题。我是否创建一个自定义端点来获取此替代身份验证凭据并返回承载令牌?如果是这样,关于利用 .NET Identity 返回令牌的正确方法有什么建议吗?我是否要修改我的自定义 OAuthAuthorizationServerProvider 以考虑这种替代方法?如果是这样,关于创建要返回给客户端的“假”(即用户不存在于 AspNet* 表中)身份的任何建议?

一如既往,感谢您的帮助。

谢谢!

【问题讨论】:

  • 为什么不把这两条数据当作用户名和密码呢?或者将它们组合起来作为密码,使用单独的用户名。
  • 两种登录方式:用户名/密码(存储在 .NET 身份提供者中)和 [示例,非实际实现] 名字/姓氏(存储在 Person 表中)。我不是特别喜欢发送诸如 grant_type=password&username=[firstName]&password=[lastName] 之类的请求。我觉得这有点hacky。如果(再次,例如)名字/姓氏有效,我已经到了进行评估的地步,然后继续。仍然不确定这是最好/首选的做事方式。在我键入此内容时,正在努力创建正确的 Auth Ticket。
  • 你的问题解决了吗,@mtm927?
  • 是的 - 我最终创建了一个代表 OAuth 响应的自定义类。假设备用凭据有效,我将手动创建一个 AuthenticationTicket,设置超时,然后使用 ApplicationJwtFormat 类来保护票证。这给了我正在寻找的访问令牌。
  • @mtm927 你能分享你对这个问题的解决方案吗?

标签: c# asp.net asp.net-identity


【解决方案1】:

@Zenichi 询问我是如何解决这个问题的,所以我添加了一个答案。事后看来,可能有更好的方法来解决这个问题,但这就是我的想法。

我添加了自定义控制器,它返回类似于身份框架的响应。我基本上只是构建一张票,然后创建一个访问令牌,然后返回给调用者。这是一个sn-p:

var properties = new AuthenticationProperties(new Dictionary<string, string>
{
{
"audience", string.Empty
}
});

var ticket = new AuthenticationTicket(identity, properties)
{
Properties =
{
IssuedUtc = DateTime.UtcNow,
ExpiresUtc = DateTime.UtcNow.AddMinutes(Config.TokenLifeSpan)
};

var accessToken = new ApplicationJwtFormat(Config.Issuer).Protect(ticket);
var expiresIn = Config.TokenLifeSpan * 60 - 1;

var token = new OAuthSuccessResponse(accessToken, "bearer", Convert.ToInt32(expiresIn), null);
return Content(HttpStatusCode.OK, token);

    public OAuthSuccessResponse(string accessToken, string tokenType, int expiresIn, string refreshToken)
    {
        access_token = accessToken;
        token_type = tokenType;
        expires_in = expiresIn;
        refresh_token = refreshToken;
    }

再看一遍,我可能(至少)会用帕斯卡对 OAuthSuccessResponse 的属性名称进行大小写,并在序列化期间使用 [JsonProperty] 属性来控制大小写。

更进一步 - 我可能应该放弃这种方法,并继续扩展我的 OAuthProvider 实现以处理传统用户/密码以及我需要的任何其他组合。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-03-09
    • 2019-10-24
    • 1970-01-01
    • 2015-10-02
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    相关资源
    最近更新 更多