當前位置:首頁 » 網頁前端 » 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);
}
}