.NET Identity:生成没有明确用户名/密码的令牌

时间:2016-05-06 18:28:53

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

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

我有一个基于非用户名/密码组合生成令牌的新要求。组合类似于高级别的用户名/密码:用户传递两个关于他们自己的内容,如果为真,则返回JWT(就像使用用户名/密码一样)。

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

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

与往常一样,任何帮助都表示赞赏。

谢谢!

1 个答案:

答案 0 :(得分:0)

@Zenichi请求我如何解决此问题,因此我添加了一个答案。后见之明,也许有更好的方法可以解决此问题,但这就是我着手的。

我添加了自定义控制器,该控制器返回的响应与Identity Framework相似。我基本上只是在构建票证,然后创建访问令牌,然后返回到调用方。这是一个片段:

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;
    }

再次查看时,我可能会(至少)将pascal放在OAuthSuccessResponse的属性名称中,并使用[JsonProperty]属性在序列化期间控制大小写。

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

希望这会有所帮助。