我有一个MVC应用程序配置为使用ASP.NET Identity。更具体地说,我已经将应用程序配置为使用OAuth。一切都很正常。我可以将用户名/密码传递给我的令牌端点,并接收令牌作为回报。我配置了刷新令牌,我剥离了默认声明并添加了自己的声明,实现了授权属性等。
我有一个新的要求,生成一个基于非用户名/密码组合的令牌。该组合在高级上类似于username/password:用户传递两条关于自己的信息,如果为true,则返回JWT(就像使用username/passwords一样)。
假设我有一个Person和AspNetUser表。某些Person记录将是AspNetUsers,但不是所有记录。那些不想使用我上面描述的方法进行身份验证的人。我想,从技术上讲,它们可以是AspNetUser记录,但没有配置密码,可能还有电子邮件。
我很难想出解决这个问题的正确办法。我是否创建一个自定义端点来接受此替代身份验证凭据并返回承载令牌?如果是的话,有什么关于利用.NET Identity返回令牌的正确方法的建议吗?我是否修改我的自定义OAuthAuthorizationServerProvider以考虑此备用方法?如果是这样的话,有什么关于创建"假的"(即用户不存在于AspNet*表中)身份的建议要返回给客户端?
和往常一样,任何帮助都会受到赞赏。
谢谢!
@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;
}
再次查看它时,我可能(至少)对OAuthSuccessResponse的属性名进行了pascal大小写,并在序列化过程中使用[JsonProperty]属性来控制大小写。
更进一步,我可能应该放弃这种方法,继续扩展我的OAuthProvider实现,以处理传统的用户/密码以及我需要的任何其他组合。
希望这能有所帮助。