本文我们将把关注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. 树上的DP

    CF#196B http://codeforces.com/contest/338/problem/B 题意:在一颗树上,给m个点,求到所有m个点距离不超过d的点的个数,所有路径长度为1. 分析:问题 ...

  2. vim编辑十六进制文件

    首先用二进制方式打开 vim file -b 之后输入 :%!xxd 还原为二进制文件 :%!xxd -r

  3. c语言typedef的用法-解惑阿!很多天书般的东西解释的不错(转)

    转自(http://www.cnblogs.com/wchhuangya/archive/2009/12/25/1632160.html) 一.基本概念剖析 int* (*a[5])(int, cha ...

  4. UVaLive 6802 Turtle Graphics (水题,模拟)

    题意:给定一个坐标,和一行命令,按照命令走,问你有多少点会被访问超过一次. 析:很简单么,按命令模拟就好,注意有的点可能走了多次,只能记作一次. 代码如下: #pragma comment(linke ...

  5. http://docwiki.embarcadero.com/RADStudio/XE7/en/Delphi_Data_Types

    http://docwiki.embarcadero.com/RADStudio/XE7/en/Delphi_Data_Types

  6. How to check “hasRole” in Java Code with Spring Security?

    From:http://stackoverflow.com/questions/3021200/how-to-check-hasrole-in-java-code-with-spring-securi ...

  7. System.Data.SqlTypes.SqlNullValueException: 数据为空。不能对空值调用此方法或

    有可能读出的数据为NULL,可以这样改: 方法一:while (reader.Read()){ for (int i = 0; i < 7; i++) { if (reader.IsDBNull ...

  8. sqlserver 自增字段修改为普通主键字段

    --增加备份字段alter Table tableName add columnNameBak bigint ; --将主键自增字段 赋值到备份字段update tableNameset column ...

  9. GET与POST提交

    get是从服务器上获取数据,post是向服务器传送数据. get 是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,[在URL中可以看到].post是通过HTT ...

  10. 关于App.config配置文件

    今天在做复习的时候,突然发现自己无法读取配置文件中的数据库连接字符串,而且检查了半天也没找出原因,最后求助万能的度娘才得以解决—— 1.App.config配置文件在项目中添加后不要修改名称,否则会出 ...