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