當前位置:編程學習大全網 - 源碼下載 - 如何使用 Web API 來對 MVC 應用程序進行身份驗證

如何使用 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)

{

AllowOnlyAlphanumericUserNames = 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 OAuthAuthorizationServerOptions

{

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 : OAuthAuthorizationServerProvider

{ public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)

{

context.Validated();

return Task.FromResult<object> (null);

}

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext 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);

}

}

  • 上一篇:數字中心源代碼
  • 下一篇:臨床系統的源代碼是免費的。
  • copyright 2024編程學習大全網