當前位置:首頁 » 密碼管理 » aspnetapi跨域訪問

aspnetapi跨域訪問

發布時間: 2023-03-17 17:05:51

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

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:336
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:378
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:612
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:32
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:107
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:945
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:742
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:803
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:511
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:372