我在一家大型企业中有一个特定于api的项目.NETMVC5Web解决方案.我正在利用WebApi2现成模板通过api对用户进行身份验证.使用单个帐户进行身份验证,获取访问令牌所需的请求主体是:

grant_type=password&username={someuser}&password={somepassword}

这是意料之中的事.

但是,我需要向脚手架方法"GrantResourceOwnerCredentials"添加第三个维度.除了判断用户名/密码之外,我还需要添加设备ID,用于限制用户帐户对特定设备的访问.不清楚的是如何将这些额外的请求参数添加到已经定义的"OAuthGrantResourceOwnerCredentialsContext"中.此上下文目前为用户名和密码腾出了空间,但显然我需要包含更多内容.

我的问题很简单,有没有一种标准的方法来扩展owin OAuth2令牌请求的登录要求,使其包含更多数据?而且,在.NET WebApi2环境中如何可靠地做到这一点呢?

推荐答案

通常情况下,我在提交问题后立即找到了答案...

ApplicationAuthProvider.cs包含以下开箱即用代码

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
    using (UserManager<IdentityUser> userManager = _userManagerFactory())
    {
        IdentityUser user = await userManager.FindAsync(context.UserName, context.Password);

        if (user == null)
        {
            context.SetError("invalid_grant", "The user name or password is incorrect.");
            return;
        }

        ClaimsIdentity oAuthIdentity = await userManager.CreateIdentityAsync(user,
            context.Options.AuthenticationType);
        ClaimsIdentity cookiesIdentity = await userManager.CreateIdentityAsync(user,
            CookieAuthenticationDefaults.AuthenticationType);
        AuthenticationProperties properties = CreateProperties(context.UserName, data["udid"]);
        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
        context.Validated(ticket);
        context.Request.Context.Authentication.SignIn(cookiesIdentity);
    }
}

通过简单地添加

var data = await context.Request.ReadFormAsync();

在该方法中,您可以访问请求体中的所有已发布变量,并随意使用它们.在我的示例中,我将其紧跟在对用户的null判断之后,以执行更严格的安全判断.

希望这能帮助一些人!

Asp.net相关问答推荐

在控制器中通过依赖项注入使用ASP.NET变量值时,不会持久化

无法从部署在应用程序负载均衡器后面的 AWS ECS 上的应用程序发送 HTTP/S 请求

如何从 Azure 上托管的应用服务获取登录用户名?

log4net 记录所有未处理的应用程序错误

HttpResponse 的区别:SetCookie、AppendCookie、Cookies.Add

为什么 ASP.NET Identity 2.0 使用 GUID/字符串作为用户 ID?

如果站点在 localhost 或 127.0.0.1 上运行,如何判断 ASP.NET MVC 视图

将 null 转换为字符串的函数

Directory.Exists 不适用于网络路径

如何使用 ASP.NET Identity 创建用户并获取新创建的 ID

如何在 ASP.NET core rc2 中禁用浏览器缓存?

使用 JSON.NET 解析 json 字符串

如何在 IIS 7.5 上使用 ASP.NET 表单身份验证保护静态文件?

如何获取正在访问 ASP.NET 应用程序的当前用户?

由于文件路径太长,网站发布失败

投票有什么问题?

当文件上传超出 ASP.NET MVC 中允许的大小时显示自定义错误页面

从物理路径获取相对虚拟路径

为什么 IFormFile 显示为空,我该如何解决?

如何将 DataTable 转换为类 Object?