当前位置:首页 » 网页前端 » aspnetwebapi架构
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

aspnetwebapi架构

发布时间: 2022-04-18 08:01:41

1. 怎样实现webapi自宿主程序

WebAPI 托管有两种方式一种是通过IIS,一种就是通过寄宿在其他程序,例如window服务,window应用程序等等,前者主要用于发布和最后调试使用,后者一般多在开发测试环节。
我们知道WCF服务可以通过System.ServiceModel.ServiceHost来加载和打开服务,那么web api可以通过System.Web.Http.SelfHost.HttpSelfHostServer来加载打开API服务
http://blog.csdn.net/hefeng_aspnet/article/details/17067495

2. 昨天有老同学问我怎么在Windows Server2012 R2里面部署 MVC 的网

一直以来都是在win8或windows server2012中进行asp.net mvc或webapi程序的部署,没有发现任何问题。今天在win2008中进行asp.net webapi的部署,访问api的时候页面显示404错误。下面步骤将解决asp.net webapi在win2008中的部署问题。
添加映射
在iis中选中需要设置的webapi站点,双击“处理程序映射”

在弹出框中添加对webapi的请求映射:

请求路径:api /*
可执行文件:%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll,注意32位和64位路径的区别。
名称:webapi,自定义名称即可
修改应用程序池的管道模式
将webapi的应用程序池的管道模式修改为经典
更新dll
映射添加之后,访问站点,不会报404错误了,但会报一些dll文件未能加载,一共有4个,名称分别如下:
System.Web.WebPages.Deployment.dll
Microsoft.Web.Infrastructure.dll
System.Web.WebPages.Razor.dll
System.Web.WebPages.dll
将上面四个dll文件复制到webapi站点到bin目录中,问题解决。

3. 求ASP.NET程序设计(C#版)(崔淼等)的电子版书,机械工业出版社

别看这些老技术了,c#做web开发,现在建议学net core.

作为一个.NET Web开发者,我最伤心的时候就是项目开发部署时面对Windows Server上贫瘠的解决方案,同样是神器Nginx,Win上的Nginx便始终不如Linux上的,你或许会说“干嘛不用windows自带的NLB呢”,那这就是我这个小鸟的从众心理了,君不见Stack Overflow 2016最新架构中,用的负载和缓存技术也都是采用在Linux上已经成熟的解决方案吗。没办法的时候找个适合的解决办法是好事,有办法的时候当然要选择最好的解决办法。

什么ASPNET Core

ASP.NET Core 是一个新的开源和跨平台的框架,用于构建如 Web 应用、物联网(IoT)应用和移动后端应用等连接到互联网的基于云的现代应用程序。ASP.NET Core 应用可运行于 .NET Core 和完整的 .NET Framework 之上。它整合了原来ASP.NET中的MVC和WebApi框架,你可以在 Windows、Mac 和 Linux 上跨平台的开发和运行你的 ASP.NET Core 应用。

4. asp.net mvc3 项目怎么开发API接口

Visual Studio为我们提供了专门用于创建ASP.NET Web API应用的项目模板,借助于此项目模板提供的向导,我们可以“一键式”创建一个完整的ASP.NET Web API项目。在项目创建过程中,Visual Studio会自动为我们添加必要的程序集引用和配置,甚至会为我们自动生成相关的代码,总之一句话:这种通过向导生成的项目在被创建之后其本身就是一个可执行的应用。

对于IDE提供的这种旨在提高生产效率的自动化机制,我个人自然是推崇的,但是我更推荐读者朋友们去了解一下这些自动化机制具体为我们做了什么?做这些的目的何在?哪些是必需的,哪些又是不必要的?正是基于这样的目的,在接下来演示的实例中,我们将摒弃Visual Studio为我们提供的向导,完全在创建的空项目中编写我们的程序。这些空项目体现在如右图所示的解决方案结构中。
如右图所示,整个解决方案一共包含6个项目,上面介绍的作为“联系人管理器”的单页Web应用对应着项目WebApp,下面的列表给出了包括它在内的所有项目的类型和扮演的角色。
·Common:这是一个空的类库项目,仅仅定义了表示联系人的数据类型而已。之所以将数据类型定义在独立的项目中,只要是考虑到它会被多个项目(WebApi和ConsoleApp)所使用。
WebApi:这是一个空的类库项目,表现为HttpController类型的Web API就定义在此项目中,它具有对Common的项目引用。
WebHost:这是一个空的ASP.NET Web应用,它实现了针对ASP.NET Web API的Web Host寄宿,该项目具有针对WebApi的项目引用。
SelfHost:这是一个空的控制台应用,旨在模拟ASP.NET Web API的Self Host寄宿模式,它同样具有针对WebApi的项目引用。
WebApp:这是一个空的ASP.NET Web应用,代表“联系人管理器”的网页就存在于该项目之中,至于具体的联系人管理功能,自然通过以Ajax的形式调用Web API来完成。
ConsoleApp:这是一个空的控制台应用,我们用它来模拟如何利用客户端代理来实现对Web API的远程调用,它具有针对Common的项目引用。
二、定义Web API
在正式定义Web API之前,我们需要在项目Common中定义代表联系人的数据类型Contact。简单起见,我们仅仅为Contact定义了如下几个简单的属性,它们分别代表联系人的ID、姓名、联系电话、电子邮箱和联系地址。
1: public class Contact
2: {
3: public string Id { get; set; }
4: public string Name { get; set; }
5: public string PhoneNo { get; set; }
6: public string EmailAddress { get; set; }
7: public string Address { get; set; }
8: }

表现为HttpController的Web API定义在WebApi项目之中,我们一般将ApiController作为继承的基类。ApiController定义在“System.Web.Http.dll”程序集中,我们可以在目录“%ProgramFiles%\Microsoft ASP.NET\ASP.NET Web Stack 5\Packages\”中找到这个程序集。具体来说,该程序集存在于子目录“Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45”中。
Web API体现在如下所示的ContactsController类型中。在该类型中,我们定义了Get、Post、Put和Delete这4个Action方法,它们分别实现了针对联系人的查询、添加、修改和删除操作。Action方法Get具有一个表示联系人ID的可缺省参数,如果该参数存在则返回对应的联系人,否则返回整个联系人列表。由于ASP.NET Web API默认实现了Action方法与HTTP方法的映射,所以方法名也体现了它们各自所能处理请求必须采用的HTTP方法。
1: public class ContactsController: ApiController
2: {
3: static List<Contact> contacts;
4: static int counter = 2;
5:
6: static ContactsController()
7: {
8: contacts = new List<Contact>();
9: contacts.Add(new Contact { Id = "001", Name = "张三",
10: PhoneNo = "0512-12345678", EmailAddress = "[email protected]",
11: Address = "江苏省苏州市星湖街328号" });
12: contacts.Add(new Contact { Id = "002", Name = "李四",
13: PhoneNo = "0512-23456789", EmailAddress = "[email protected]",
14: Address = "江苏省苏州市金鸡湖大道328号" });
15: }
16:
17: public IEnumerable<Contact> Get(string id = null)
18: {
19: return from contact in contacts
20: where contact.Id == id || string.IsNullOrEmpty(id)
21: select contact;
22: }
23:
24: public void Post(Contact contact)
25: {
26: Interlocked.Increment(ref counter);
27: contact.Id = counter.ToString("D3");
28: contacts.Add(contact);
29: }
30:
31: public void Put(Contact contact)
32: {
33: contacts.Remove(contacts.First(c => c.Id == contact.Id));
34: contacts.Add(contact);
35: }
36:
37: public void Delete(string id)
38: {
39: contacts.Remove(contacts.First(c => c.Id == id));
40: }
41: }

简单起见,我们利用一个静态字段(contacts)表示存储的联系人列表。当ContactsController类型被加载的时候,我们添加了两个ID分别为“001”和“002”的联系人记录。至于实现联系人CRUD操作的Action方法,我们也省略了必要的验证,对于本书后续的演示的实例,我们基本上也会采用这种“简写”的风格。

5. 如何在Windows Server2008R2中部署WebAPI

一、安装说明:
1、安装基本信息
电脑软件
在WindowsServer2008(或WindowsServer2008R2)中,单击“开始”-“程序”-“管理工具”-“服务器管理”,或在“运行”中输入命令:servermanager.msc命令打“服务器管理”程序。
在“角色”选项中,单击“添加角色”:
选择服务器角色:Web服务器(IIS)
单击选中“web服务器(IIS))前面的单选框。
在弹出的对话框中,单击“添加必需的功能”:

“添加角色向导”对web服务器进行简单介绍,之后单击“下一步”:
选择角色需要的相关服务之后单击“下一步”:
确认安装选择,之后单击“下一步”:
系统开始安装所选的角色服务,可能需要几十秒可几钟时间:
安装完成,点击关闭即可:

名称:IIS7.0安装
大小:10MB|版本:7.0|类别:系统工具|语言:中文
应用平台:windows server 2008
2、安装介绍
windows server 2008系统中的iis安装,与windows server 2003中的安装明显不再相同了,windows server 2008安装iis,不再需要其他相关组件,不像windows server 2003需要有i386文件,下面来详细介绍一下,windows server 2008安装iis的步骤:
二、安装步骤:
开始--服务器管理--角色--添加角色

点击添加必需的功能

勾选在“Web服务器(IIS)”

点击下一步

下面是选择“角色服务”的,针对你需要的进行相应的选择

然后点击“下一步”开始确认安装

然后等待安装成功

6. 怎么进行ASPNET团队开发

如果你是老板,只需要选好一个人,就是架构师。然后交给他去组织人手开发。上了年纪的牛人就算没工作,也几乎都在当老板,碰到一个十分难得,可遇不可求。
慎重选人!然后珍惜人才!
这个人需要什么样的素质:
1,个人经验丰富,开发牛逼;
“自己技术不行,带团队却不错”,这都是混混在洗脑,千万别信,实际工作中没有这样的人!(如果“有”,也一定是表面是他带,其实是另外一位技术牛逼的高手在组织开发)
试用期可以让他单独做几个历史遗留的难点,观察他应付困难的态度和解决方案,他本人单独做不了事,带团队也一定玩完。
一进公司就要带人的几乎都是混混,希望靠下属做完所有的事。架构师需要人是一个自然发生的过程,在系统架构已经基本搭好,已知难点已经解决,发现有大量重复性、杂碎的业务细活需要人手,才会真正提出要人。架构师接到项目总是要单独分析一段时间的,所以一开始让他单独做事,根本不耽误进度!
2,以目标为导向的价值观;
开发的目标首先是满足需求、然后是开发速度、性能、扩展性共四项,其它用什么语言、什么技术框架、什么规范都只是达到这四项的工具,而不是目标,有些开发经理在网上查新词汇新概念,学到点皮毛就开吹,避开这四项目标扯得天花乱坠,既麻醉了自己也忽悠了老板,最后一事无成。
识别这一点无非两步:
先看他提的解决方案是不是紧扣四项要求,如果他不是就事论事解释他的方案是为了满足四项目标之一,而只是空泛而谈“这个技术流行;这是常识。。。”,八九是百无一用的教条主义者。
3,很强的模块化思想
对于团队,分享“可跨项目使用的模块”是效率最高的做法,架构师没有这个意识必然会导致项目延期,观察这点很简单:有大量历史积累的作品、在论坛上经常分享一些模块化的类、喜欢帮助开发人员分析和抽象模块。
本人做web开发多年,对技术混混深恶痛绝,见到此问,忍不住回答,欢迎以后找本人沟通交流。

7. rails相较于.net WebAPI有什么优势,有什么劣势

vs中,打开工具=>nuget程序包管理器=>程序包管理器控制台,然后其中一行一行地输入以下的更新指令。Update-PackageMicrosoft.AspNet.WebApi-Version5.2.2汉化包Update-PackageMicrosoft.AspNet.WebApi.Client.zh-Hans-Version5.2.2Update-PackageMicrosoft.AspNet.WebApi.Core.zh-Hans-Version5.2.2Update-PackageMicrosoft.AspNet.WebApi.WebHost.zh-Hans-Version5.2.2Update-PackageEntityFramework-Version6.0.1Update-PackageEntityFramework.zh-Hans-Version6.0.1Update-PackageMicrosoft.AspNet.Mvc-Version5.2.2Update-PackageMicrosoft.AspNet.Mvc.zh-Hans-Version5.2.2Update-PackageMicrosoft.AspNet.WebApi.HelpPage-Version5.2.2Update-PackageMicrosoft.AspNet.WebApi.OData-Version5.2.2Update-PackageMicrosoft.AspNet.WebApi.Tracing-Version5.2.2上面package的版本号参考了vs2013中的webapi项目模板中的版本号。引入这些包的过程中,vs有可能提示要重启vs,请重启vs。错误:“未能找到元数据文件”更新完package之后,重新编译,有可能出现“未能找到元数据文件”。解决的方法是找到出错的项目,然后去掉报错的引用项,然后再重新引用。错误:预定义的类型"Microsoft.CSharp.RuntimeBinder.Binder"未定义或未导入错误再次编译,有可能出现错误提示“预定义的类型"Microsoft.CSharp.RuntimeBinder.Binder"未定义或未导入”,解决的方法是:(1)用记事本打开项目文件(后缀名为.csproj),找到项,可能会找到多个,选择其中一个,在里面加入(2)保存项目文件,然后重新加载项目项目文件。

8. 如何使用 Web API 来对 MVC 应用程序进行身份验证

首先,让我们先更新 API 项目

我们将先对 API 项目进行必要的修改,修改完成之后再切换到 Web 项目对客户端进行更新。

第1步:我们需要一个数据库

在能做任何操作之前我们需要先创建一个数据库。本例中将使用 SQL Server Express。如果你没有安装,可以从这里下载 SQL Server Express。安装完成之后,创建一个名为 CallingWebApiFromMvc 的数据库。这就是第一步要做的。

Api 项目还需要一个数据库连接字符串,否则我们寸步难行。把下面这段代码插入到 Api 项目的Web.config 文件中:

<connectionStrings>
<add name="ApiFromMvcConnection" connectionString="Data Source=(local);Initial Catalog=CallingWebApiFromMvc;Integrated Security=True" providerName="System.Data.SqlClient" /></connectionStrings>

认证(Identity)框架会自动创建我们管理用户所需要的成员关系表,现在不需要担心去提前创建它们。

第2步:添加相关的Nuget包

接下来我们添加用于OWIN和Windows认证的Nuget包。打开包管理控制台,切换Api项目为缺省项目,输入以下命令:

Install-Package Microsoft.AspNet.WebApi.Owin
Install-Package Microsoft.Owin.Host.SystemWeb
Install-Package Microsoft.AspNet.Identity.EntityFramework
Install-Package Microsoft.AspNet.Identity.Owin

使用这些包可以在我们的应用中启动一个OWIN服务器,然后通过EntityFramework把我们的用户保存到SQL Server。

第3步:添加管理用户的Identity类

我们使用基于Windows认证机制之上的Entity框架来管理数据库相关的业务。首先我们需要添加一些用于处理的类。在Api项目里添加一个Identity目录作为我们要添加类的命名空间。然后添加如下的类:

public class ApplicationUser : IdentityUser
{
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{ public ApplicationDbContext() : base("ApiFromMvcConnection") {}
public static ApplicationDbContext Create()
{ return new ApplicationDbContext();
}
}

注意我们传给基类构造函数的参数ApiFromMvcConnection要和Web.config中的连接字符串中的name相匹配。

public class ApplicationUserManager : UserManager<ApplicationUser>
{ public ApplicationUserManager(IUserStore<ApplicationUser> store) : base(store)
{
} public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{ var manager = new ApplicationUserManager(new UserStore<ApplicationUser> (context.Get<ApplicationDbContext> ()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator<ApplicationUser> (manager)
{
= false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
}; var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser> (dataProtectionProvider.Create("ASP.NET Identity"));
} return manager;
}
}

第4步:添加OWIN启动类

为了让我们的应用程序作为OWIN服务器上运行,我们需要在应用程序启动时初始化。我们可以通过一个启动类做到这一点。我们将装点这个类的
OwinStartup属性,因此在应用程序启动时触发。这也意味着,我们可以摆脱的Global.asax和移动它们的
Application_Start代码转换成我们新的启动类。

using Microsoft.Owin;

[assembly: OwinStartup(typeof(Levelnis.Learning.CallingWebApiFromMvc.Api.Startup))]
namespace Levelnis.Learning.CallingWebApiFromMvc.Api
{
using System;
using System.Web.Http;
using Identity;
using Microsoft.Owin.Security.OAuth;
using Owin;
using Providers;
public class Startup
{ public void Configuration(IAppBuilder app)
{
GlobalConfiguration.Configure(WebApiConfig.Register);
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager> (ApplicationUserManager.Create); var oAuthOptions = new
{
TokenEndpointPath = new PathString("/api/token"),
Provider = new ApplicationOAuthProvider(),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
AllowInsecureHttp = true
};
// Enable the application to use bearer tokens to authenticate users
app.UseOAuthBearerTokens(oAuthOptions);
}
}
}

在应用程序启动时,我们正在建立自己的服务器。在这里,我们配置令牌端点并设置自己的自定义提供商,我们用我们的用户进行身份验证。在我们的例子中,我们使用了ApplicationOAuthProvider类。让我们来看看现在:

第5步:添加OAuth的提供商

public class ApplicationOAuthProvider :
{ public override Task ValidateClientAuthentication( context)
{
context.Validated();
return Task.FromResult<object> (null);
}
public override async Task GrantResourceOwnerCredentials( context)
{
var userManager = context.OwinContext.GetUserManager<ApplicationUserManager> ();
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 user.GenerateUserIdentityAsync(userManager, OAuthDefaults.AuthenticationType); var cookiesIdentity = await user.GenerateUserIdentityAsync(userManager, CookieAuthenticationDefaults.AuthenticationType); var properties = CreateProperties(user.UserName); var ticket = new AuthenticationTicket(oAuthIdentity, properties);
context.Validated(ticket);
context.Request.Context.Authentication.SignIn(cookiesIdentity);
}
private static AuthenticationProperties CreateProperties(string userName)
{
var data = new Dictionary<string, string>
{
{
"userName", userName
}
};
return new AuthenticationProperties(data);
}
}

我们感兴趣的是这里2种方法。第一,ValidateClientAuthentication,只是验证客户端。我们有一个客户端,所以返回成
功。这是一个异步方法签名但没有异步调用发生。正因为如此,我们可以离开了异步修改,但我们必须返回一个任务自己。我们增加了一个名为
GenerateUserIdentityAsync的ApplicationUser,它看起来像这样的方法:

public class ApplicationUser : IdentityUser
{ public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType)
{
var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
return userIdentity;
}
}

第6步:注册一个新用户 - API端
所以,我们有到位的所有Identity类管理用户。让我们来看看RegisterController,将新用户保存到我们的数据库。它接受一个RegisterApi模式,这是简单的:

public class RegisterApiModel
{
[Required]
[EmailAddress] public string Email { get; set; }

[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
public string Password {
get; set;
}

[Required]
[Display(Name = "Confirm Password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}

控制器本身,如果注册成功只是返回一个200 OK响应。如果验证失败,则返回401错误请求的响应。

public class RegisterController : ApiController
{ private ApplicationUserManager UserManager
{ get
{ return Request.GetOwinContext().GetUserManager<ApplicationUserManager> ();
}
} public IHttpActionResult Post(RegisterApiModel model)
{ if (!ModelState.IsValid)
{ return BadRequest(ModelState);
} var user = new ApplicationUser
{
Email = model.Email,
UserName = model.Email,
EmailConfirmed = true
};
var result = UserManager.Create(user, model.Password);
return result.Succeeded ? Ok() : GetErrorResult(result);
}
private IHttpActionResult GetErrorResult(IdentityResult result)
{
if (result == null)
{
return InternalServerError();
}
if (result.Errors != null)
{
foreach (var error in result.Errors)
{
ModelState.AddModelError("", error);
}
}
if (ModelState.IsValid)
{
// No ModelState errors are available to send, so just return an empty BadRequest.
return BadRequest();
}
return BadRequest(ModelState);
}
}

9. 如何让webapi的版本降为.net4.0

vs中,打开 工具 => nuget程序包管理器 => 程序包管理器控制台,然后其中一行一行地输入以下的更新指令。
Update-Package Microsoft.AspNet.WebApi -Version 5.2.2

汉化包
Update-Package Microsoft.AspNet.WebApi.Client.zh-Hans -Version 5.2.2
Update-Package Microsoft.AspNet.WebApi.Core.zh-Hans -Version 5.2.2
Update-Package Microsoft.AspNet.WebApi.WebHost.zh-Hans -Version 5.2.2

Update-Package EntityFramework -Version 6.0.1
Update-Package EntityFramework.zh-Hans -Version 6.0.1

Update-Package Microsoft.AspNet.Mvc -Version 5.2.2
Update-Package Microsoft.AspNet.Mvc.zh-Hans -Version 5.2.2

Update-Package Microsoft.AspNet.WebApi.HelpPage -Version 5.2.2

Update-Package Microsoft.AspNet.WebApi.OData -Version 5.2.2

Update-Package Microsoft.AspNet.WebApi.Tracing -Version 5.2.2

上面package的版本号参考了vs2013中的webapi项目模板中的版本号。引入这些包的过程中,vs有可能提示要重启vs,请重启vs。
错误:“未能找到元数据文件”
更新完package之后,重新编译,有可能出现“未能找到元数据文件”。
解决的方法是找到出错的项目,然后去掉报错的引用项,然后再重新引用。
错误:预定义的类型"Microsoft.CSharp.RuntimeBinder.Binder"未定义或未导入 错误
再次编译,有可能出现错误提示“预定义的类型"Microsoft.CSharp.RuntimeBinder.Binder"未定义或未导入” ,解决的方法是:
(1)用记事本打开项目文件(后缀名为 .csproj ),找到<ItemGroup>项,可能会找到多个,选择其中一个,在里面加入
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />

(2)保存项目文件,然后重新加载项目项目文件。

10. 使用aspnet.identity 身份验证的框架中,怎么对现有用户进行删除

首先让我先更新 API 项目

我先 API 项目进行必要修改修改完再切换 Web 项目客户端进行更新

第1步:我需要数据库

能做任何操作前我需要先创建数据库本例使用 SQL Server Express没安装载 SQL Server Express安装完创建名 CallingWebApiFromMvc 数据库第步要做

Api 项目需要数据库连接字符串否则我寸步难行面段代码插入 Api 项目Web.config 文件:

认证(Identity)框架自创建我管理用户所需要员关系表现需要担提前创建

第2步:添加相关Nuget包

接我添加用于OWINWindows认证Nuget包打包管理控制台切换Api项目缺省项目输入命令:

Install-Package Microsoft.AspNet.WebApi.Owin
Install-Package Microsoft.Owin.Host.SystemWeb
Install-Package Microsoft.AspNet.Identity.EntityFramework
Install-Package Microsoft.AspNet.Identity.Owin

使用些包我应用启OWIN服务器通EntityFramework我用户保存SQL Server

第3步:添加管理用户Identity类

我使用基于Windows认证机制Entity框架管理数据库相关业务首先我需要添加些用于处理类Api项目添加Identity目录作我要添加类命名空间添加类:

public class ApplicationUser : IdentityUser
{
}

public class ApplicationDbContext : IdentityDbContext
{ public ApplicationDbContext() : base("ApiFromMvcConnection") {}
public static ApplicationDbContext Create()
{ return new ApplicationDbContext();
}
}

注意我传给基类构造函数参数ApiFromMvcConnection要Web.config连接字符串name相匹配

public class ApplicationUserManager : UserManager
{ public ApplicationUserManager(IUserStore store) : base(store)
{
} public static ApplicationUserManager Create(IdentityFactoryOptions options, IOwinContext context)
{ var manager = new ApplicationUserManager(new UserStore (context.Get ()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator (manager)
{
= false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
}; var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider = new DataProtectorTokenProvider (dataProtectionProvider.Create("ASP.NET Identity"));
} return manager;
}
}

第4步:添加OWIN启类

让我应用程序作OWIN服务器运行我需要应用程序启初始化我通启类做点我装点类
OwinStartup属性应用程序启触发意味着我摆脱Global.asax移
Application_Start代码转换我新启类

using Microsoft.Owin;

[assembly: OwinStartup(typeof(Levelnis.Learning.CallingWebApiFromMvc.Api.Startup))]
namespace Levelnis.Learning.CallingWebApiFromMvc.Api
{
using System;
using System.Web.Http;
using Identity;
using Microsoft.Owin.Security.OAuth;
using Owin;
using Providers;
public class Startup
{ public void Configuration(IAppBuilder app)
{
GlobalConfiguration.Configure(WebApiConfig.Register);
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext (ApplicationUserManager.Create); var oAuthOptions = new
{
TokenEndpointPath = new PathString("/api/token"),
Provider = new ApplicationOAuthProvider(),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
AllowInsecureHttp = true
};
// Enable the application to use bearer tokens to authenticate users
app.UseOAuthBearerTokens(oAuthOptions);
}
}
}

应用程序启我建立自服务器我配置令牌端点并设置自自定义提供商我用我用户进行身份验证我例我使用ApplicationOAuthProvider类让我看看现:

第5步:添加OAuth提供商

public class ApplicationOAuthProvider :
{ public override Task ValidateClientAuthentication( context)
{
context.Validated();
return Task.FromResult (null);
}
public override async Task GrantResourceOwnerCredentials( context)
{
var userManager = context.OwinContext.GetUserManager ();
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 user.GenerateUserIdentityAsync(userManager, OAuthDefaults.AuthenticationType); var cookiesIdentity = await user.GenerateUserIdentityAsync(userManager, CookieAuthenticationDefaults.AuthenticationType); var properties = CreateProperties(user.UserName); var ticket = new AuthenticationTicket(oAuthIdentity, properties);
context.Validated(ticket);
context.Request.Context.Authentication.SignIn(cookiesIdentity);
}
private static AuthenticationProperties CreateProperties(string userName)
{
var data = new Dictionary
{
{
"userName", userName
}
};
return new AuthenticationProperties(data);
}
}

我兴趣2种第ValidateClientAuthentication验证客户端我客户端所返
功异步签名没异步调用发我离异步修改我必须返任务自我增加名
看起像:

public class ApplicationUser : IdentityUser
{ public async Task GenerateUserIdentityAsync(UserManager manager, string authenticationType)
{
var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
return userIdentity;
}
}

第6步:注册新用户 - API端
所我位所Identity类管理用户让我看看RegisterController新用户保存我数据库接受RegisterApi模式简单:

public class RegisterApiModel
{
[Required]
[EmailAddress] public string Email { get; set; }

[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
public string Password {
get; set;
}

[Required]
[Display(Name = "Confirm Password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}

控制器本身注册功返200 OK响应验证失败则返401错误请求响应

public class RegisterController : ApiController
{ private ApplicationUserManager UserManager
{ get
{ return Request.GetOwinContext().GetUserManager ();
}
} public IHttpActionResult Post(RegisterApiModel model)
{ if (!ModelState.IsValid)
{ return BadRequest(ModelState);
} var user = new ApplicationUser
{
Email = model.Email,
UserName = model.Email,
EmailConfirmed = true
};
var result = UserManager.Create(user, model.Password);
return result.Succeeded ? Ok() : GetErrorResult(result);
}
private IHttpActionResult GetErrorResult(IdentityResult result)
{
if (result == null)
{
return InternalServerError();
}
if (result.Errors != null)
{
foreach (var error in result.Errors)
{
ModelState.AddModelError("", error);
}
}
if (ModelState.IsValid)
{
// No ModelState errors are available to send, so just return an empty BadRequest.
return BadRequest();
}
return BadRequest(ModelState);
}
}