如何扩展Owin OAuth以适应应用程序级别登录确认

时间:2015-08-19 16:29:47

标签: asp.net-mvc oauth oauth-2.0 owin

我目前正在使用使用Owin OAuth身份验证的MVC5应用程序。我期待扩展登录标准,我添加了几个表(应用程序表(ApplicationId(guid),ApplicationName(nvarchar)和ApplicationUserTable(id,ApplicationId(来自Application表的FK),UserId(来自ASPNetUsers表的FK列) ))在我的安全数据库中。 可以请任何人给我一些关于如何在Owin上下文中访问此ApplicationUserTable的想法,以便我可以首先验证用户是否属于特定应用程序?我查看了很多示例,但没有找到与我正在使用的特定场景相关的任何内容。

1 个答案:

答案 0 :(得分:0)

您可以将ApplicationId字段设置为ClientId,然后每个应用程序都有不同的ClientId。

当用户发送身份验证令牌请求时,在检查用户凭据时使用GrantResourceOwnerCredentials方法检查用户是否属于接收ClientId所代表的应用程序。

简单来说,它可能类似于以下内容:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
    ...
    var user = await _userService.GetUserAsync(context.UserName, context.Password, context.ClientId);
    if (user == null)
    {
        context.SetError("invalid_grant", "The user name, password or clientId is incorrect.");
        return;
    }
    ...
    var ticket = new AuthenticationTicket(identity, props);
    context.Validated(ticket);
}

在用户服务中:

public async Task<User> GetUserAsync(string userName, string password, string clientId = null)
{
    var user = await _userManager.FindAsync(userName, password);

    if (user == null || (clientId != null && user.ApplicationUsers.Where(au => au.ApplicationId == clientId).Count() == 0))
    {
        return null;
    }

    return user;
}

ValidateClientAuthentication方法中,您应该在Application表中验证ClientId-Secret。

我希望它有所帮助。