本文我们将把关注Visual Studio用户认证模板中的 本地用户名/密码帐号特性。他们将其分为了两部分:帐户控制器具备如创建帐号和修改密码等功能;另一部分是在OAuth2认证服务器中进行的认证。我们从创建一个账户开始:

为了创建一个账户,我们需要Post到/api/account/register 节点,对应到帐号控制器的Register方法,这个方法允许匿名访问。

客户端可以这样做:


用户注册private async Task Register(string userName, string password)
{
var client = new HttpClient { BaseAddress = _baseAddress }; var data = new Dictionary<string, string>
{
{ “UserName”, userName },
{ “Password”, password },
{ “ConfirmPassword”, password }
}; var response = await client.PostAsync(
“api/account/register”,
new FormUrlEncodedContent(data));
response.EnsureSuccessStatusCode();
}

帐号控制器会使用ASP.NET的身份框架在本地数据库中创建一个新用户(在确认密码和确认密码相同的前提下)。

IdentityResult result = await UserManager.CreateAsync(user, model.Password);
IHttpActionResult errorResult = GetErrorResult(result); if (errorResult != null)
{
return errorResult;
} return Ok();

在真实的应用中你或许想要进行邮箱验证和其他的验证步骤,但那已经超出了例子的范围。客户端可以通过内建的OAuth2资源所有者节点为用户申请一个令牌,该节点为/token。更多的背景信息请参阅here.

客户端使用OAuth2Client 类似这样:

private async Task<TokenResponse> RequestToken(
string userName, string password)
{
var client = new OAuth2Client(
new Uri(_baseAddress.AbsoluteUri + “/token”));
return await client.RequestResourceOwnerPasswordAsync(userName, password);
}

微软提供的这个认证模板连接了一个所谓的提供商(ApplicationOAuthProvider.cs)作为认证服务器中间件。其中负责验证用户认证信息并创建一个认证“票”并将其转换为访问令牌返回的相关的方法是:calledGrantResourceOwnerCredentials 。

var user = await userManager.FindAsync(context.UserName, context.Password);

if (user == null)
{
context.SetError(
“invalid_grant”, “The user name or password is incorrect.”);
return;
} var oAuthIdentity = await userManager.CreateIdentityAsync(user,
context.Options.AuthenticationType);
var properties = CreateProperties(user.UserName);
var ticket = new AuthenticationTicket(oAuthIdentity, properties);
context.Validated(ticket);

注意:这个方法不仅进行了验证用户身份和创建令牌,它还将用户名作为了OAuth2返回中的一部分(作为一个额外的参数)。我猜测这仅仅是一个指导如何个性化的返回相关信息到客户端的示例,不需要强制进行一次额外的API访问来获取这些额外信息。由于这些信息没有签名,所以不要基于这个方法传输与安全相关的信息(对比OpenID连接身份令牌token

注意2:这个方法也可以设置一个应用Cookie。但我不觉得这是一个好的理由。

使用访问令牌,客户端下载将被允许访问帐号控制器中其他的管理功能(如:用户信息,修改密码,设置密码等)或者其他任何使用[Authorize] 标记的控制器。如:

private async Task<string> GetUserInfo(string token)
{
var client = new HttpClient { BaseAddress = _baseAddress };
client.SetBearerToken(token); var response = await client.GetStringAsync(“api/account/userInfo”);
return response;
}

Web Api2 用户认证模板解析---本地用户的更多相关文章

  1. Web Api 2 用户认证模板解析-----外部用户认证模式

    一般的社交提供商不提供一个Web Service进行身份验证(有很好的理由),而提供一个身份验证的界面,其中包含了某种协议如OpenID(连接)或使用OAuth2认证.这意味着客户端应用必须使用一个浏 ...

  2. 翻译:WebApi 认证--用户认证Oauth解析

        The Web API v2用户认证模板提供了流行的应用用户认证场景,如.使用本地帐号的用户名密码认账 (包括创建用户.设置和修改密码)以及使用第三方的认证方式,如facebook,googl ...

  3. Django自定义用户认证系统之自定义用户模型

    参考文档:http://python.usyiyi.cn/django/topics/auth/customizing.html Django 自带的认证系统足够应付大多数情况,但你或许不打算使用现成 ...

  4. Django (auth模块、User对象、用户认证、线上-用户认证)

    一.auth模块 django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: authenticate()    提供了用户认证,即验证用户名以及密码是否正确,一般需要usern ...

  5. Django - 用户认证、用户组、用户权限

    https://www.cnblogs.com/ccorz/p/6358074.html auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理. auth可以和a ...

  6. 使用外部LDAP用户认证后,DJANGO用户如何作登陆的操作?

    公司的要求,使用公司的UM帐号验证密码,然后,在DJANGO里登陆. 因为没有authenticate函数,只有login函数,所以不能简单的使用用户来login,而需要加一个backend参数... ...

  7. CentOS6.5下搭建ftp服务器(三种认证模式:匿名用户、本地用户、虚拟用户)

    CentOS 6.5下搭建ftp服务器 vsftpd(very secure ftp daemon,非常安全的FTP守护进程)是一款运行在Linux操作系统上的FTP服务程序,不仅完全开源而且免费,此 ...

  8. Django学习笔记(13)——Django的用户认证(Auth)组件,视图层和QuerySet API

    用户认证组件的学习 用户认证是通过取表单数据根数据库对应表存储的值做比对,比对成功就返回一个页面,不成功就重定向到登录页面.我们自己写的话当然也是可以的,只不过多写了几个视图,冗余代码多,当然我们也可 ...

  9. 记录一次centos6.4版本的VSFTP本地用户登陆的配置

    其实vsftp是一个非常常用而且简单的服务,但是假如服务不是你配置的前者没有留下参考档案,的确是件头疼的事儿,特此记录下. 首先是vsftp的安装当然安装有源码的编译和yum等 这里我选择rpm包的y ...

随机推荐

  1. 如何在Centos上安装python3.4

    Centos上面默认的Python版本是2.6,本文介绍如何安装3.4版本. 0.下载前准备 需要安装以下库,不然会有问题. yum -y install zlib-devel bzip2-devel ...

  2. spring mvc中的valid

    当你希望在spring mvc中直接校验表单参数时,你可以采用如下操作: 声明Validator的方式: 1.为每一个Controller声明一个Validator @Controller publi ...

  3. USB枚举过程(2)

    用bus hound 得到的数据 GET MAX LUN 命令 详见USB_MSC_BlukOnly_v1.0 接下来用到的是UFI  SCSI

  4. Java沙箱技术

    自从Java技术出现以来,有关Java平台的安全性及由Java技术发展所引发的新的安全性问题,引起了越来越多的关注.目前,Java已经大量应用在各个领域,研究Java的安全 性对于更好地使用Java具 ...

  5. Failed to load libGL.so in android

    使用命令:find / -name libGL.so 得到: /usr/lib/i386-linux-gnu/libGL.so /usr/lib/i386-linux-gnu/mesa/libGL.s ...

  6. Linux下如何用vi编辑和保存文件

    vi是Linux终端下或控制台下常用的编辑器,基本的操作方式为:vi /路径/文件名 例如,vi /etc/fstab表示显示/etc/fstab文件的内容.使用键盘上的Page Up和Page Do ...

  7. Java垃圾回收器

    一.Java垃圾回收器要负责完成以下3个任务: 1.分配内存 2.确保被引用对象的内存不被错误回收 3.回收不再被引用的对象的内存空间 二.垃圾回收是一个复杂而又耗时的操作.如果JVM花费过多的时间在 ...

  8. c#学习之旅------01

    一.交换两个数的值 //交换两个数的值 #region 方法一 , num2 = ;//待交换的两个数值 int temp;//临时变量 temp = num1; num1 = num2; num2 ...

  9. 一个可创建读取日志的管理类(可固定创建2M大小的日志文件)

    这里,将日志管理基类命名为LogManagerBase(抽象类),具体的不同类型的日志可以通过继承完成.该基类可将日志以每个2M的方式存储起来,并可以读取当前正在使用的日志的所有内容. 要实现该基类, ...

  10. DNS端口说明

    DNS服务器之间的区域复制需要使用TCP 53端口 客户端通过DNS服务器解析域名需要使用UDP 53端口 如果DNS转发配置未生效,则可尝试重启DNS服务