學習core登陸認證與跨域資源共享是越不過的砍,因此我在學習中一樣也遇到啦這兩個問題,今天咱們就用示例來演示下使用下這2個技術點吧.html
本篇主要內容以下:ajax
一、展現一個登陸認證的簡單示例json
二、跨域資源訪問跨域
三、跨域獲取登陸認證的用戶信息瀏覽器
首先咱們實現登陸這個功能,代碼以下服務器
[Authorize] public class AccountController : Controller { [HttpGet] [AllowAnonymous] public IActionResult Login(string returnUrl = null) { ViewData["ReturnUrl"] = returnUrl; if (this.User.Identity.IsAuthenticated) { return RedirectPermanent(returnUrl); } return View(); } [HttpPost] [AllowAnonymous] public async Task<IActionResult> Login(string userName, string password,string returnUrl=null) { ViewData["ReturnUrl"] = returnUrl; if (!string.IsNullOrEmpty(userName) && userName == password) { var claims = new List<Claim>(){ new Claim(ClaimTypes.Name,userName),new Claim("password",password),new Claim("realname","張龍豪") }; //init the identity instances var userPrincipal = new ClaimsPrincipal(new ClaimsIdentity(claims, "Customer")); //signin await HttpContext.Authentication.SignInAsync("CookieAuth", userPrincipal, new AuthenticationProperties { ExpiresUtc = DateTime.UtcNow.AddMinutes(20), IsPersistent = false, AllowRefresh = false }); return RedirectPermanent(returnUrl); } else { ViewBag.ErrMsg = "UserName or Password is invalid"; return View(); } }
前臺代碼以下cookie
<html> <head> <meta name="viewport" content="width=device-width" /> <title>Login</title> </head> <body> <form asp-controller="Account" asp-action="Login" method="post" class="form-horizontal" asp-route-returnurl="@ViewData["ReturnUrl"]" role="form"> <div class="form-group"> <label class="col-md-2 control-label">UserName</label> <div class="col-md-10"> <input type="text" name="username" /> </div> </div> <div class="form-group"> <label class="col-md-2 control-label">Password</label> <div class="col-md-10"> <input type="password" name="password" /> </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <button type="submit" class="btn btn-default">Log in</button> </div> </div> </form> </body> </html>
在Startup文件的Configure方法中加入下面代碼app
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationScheme = "CookieAuth", //認證方案:這是一個已知中間件的值,當有多個實例的中間件若是你想限制受權到一個實例時這個選項將會起做用。 LoginPath = new PathString("/Account/Login"), //登陸路徑:這是當用戶試圖訪問資源但未通過身份驗證時,程序將會將請求重定向到這個相對路徑。 AccessDeniedPath = new PathString("/Account/Forbidden"), //禁止訪問路徑:當用戶試圖訪問資源時,但未經過該資源的任何受權策略,請求將被重定向到這個相對路徑。 AutomaticAuthenticate = true, //自動認證:這個標誌代表中間件應該會在每一個請求上進行驗證和重建他建立的序列化主體。 AutomaticChallenge = true, //自動挑戰:這個標誌標明當中間件認證失敗時應該重定向瀏覽器到登陸路徑或者禁止訪問路徑。 SlidingExpiration = true, //Cookie能夠分爲永久性的和臨時性的。 臨時性的是指只在當前瀏覽器進程裏有效,瀏覽器一旦關閉就失效(被瀏覽器刪除)。 永久性的是指Cookie指定了一個過時時間,在這個時間到達以前,此cookie一直有效(瀏覽器一直記錄着此cookie的存在)。 slidingExpriation的做用是,指示瀏覽器把cookie做爲永久性cookie存儲,可是會自動更改過時時間,以使用戶不會在登陸後並一直活動,可是一段時間後卻自動註銷。也就是說,你10點登陸了,服務器端設置的TimeOut爲30分鐘,若是slidingExpriation爲false,那麼10:30之後,你就必須從新登陸。若是爲true的話,你10:16分時打開了一個新頁面,服務器就會通知瀏覽器,把過時時間修改成10:46。 更詳細的說明仍是參考MSDN的文檔。 CookieHttpOnly = false //默認爲true });
好啦,你能夠看到有[Authorize]屬性的方法或者控制器都須要登陸才能訪問,若是沒有登陸是不容許訪問的.async
接下來你可能須要獲取當前登陸用戶的用戶信息,代碼以下:ide
[HttpPost] public string GetCurrUserRealname() { var s = this.User.Identities.First(u => u.IsAuthenticated).FindFirst("realname").Value; var ss = this.User.Identity.Name; return ss + ":" + s; }
$.post("/Account/GetCurrUserRealname", null, function (data) { $("#content").html(data); });
ok,這樣就能獲取到當前登陸的用戶信息
那如何退出呢?代碼以下:
public async Task<JsonResult> Logout() { await HttpContext.Authentication.SignOutAsync("CookieAuth"); return Json(new { data = "驗證方案:CookieAuth退出成功" }); }
這樣看來完整的登陸驗證就完成啦,可是目前位置,個人代碼都還簡單的要命,只能初學者拿來入手,具體還有不少東西能夠擴展.咱們須要本身思考學習.
那這個跨域的環境呢,須要咱們本身搞一下.怎麼搞,以下
本地測試前期準備
1.首先咱們搞兩個core的站點
2.本地host配置兩個域名,並在項目中作以下設置
hosts以下:
網站的launchSettings.json文件中配置項目CoreCorsATest爲 "applicationUrl": "http://b.local.com:63455/", 項目AuthentiactionTest爲 "applicationUrl": "http://a.local.com:50307/".
3. 實驗約定:
咱們在項目AuthentiactionTest中寫接口,項目CoreCorsATest中調用AuthentiactionTest中的接口.
不作任何處理寫接口跨域調用
AuthentiactionTest中寫下以下接口
public class HomeController : Controller { public string GetName() { return "張龍豪"; }
CoreCorsATest中以下調用
$.post("http://a.local.com:50307/Home/GetName", null, function (data) { $("#content").html(data); });
結果以下:接口調用成功,可是跨域資源不容許使用
解決問題
設置跨域的域名
public void ConfigureServices(IServiceCollection services) { //services.AddAuthorization(); // Add framework services. services.AddMvc(); services.AddCors(options => options.AddPolicy("AllowSameDomain", builder => builder.WithOrigins("http://a.local.com:50307", "http://b.local.com:63455"))); }
下面的兩種調用方式
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { app.UseCors("AllowSameDomain");
public class HomeController : Controller { [EnableCors("AllowSameDomain")] public string GetName() { return "張龍豪"; }
這個問題就是上面跨域訪問的資源若是出現 [Authorize]特性,或者是訪問當前用戶的登陸信息,用剛纔的方法是不行的.
登陸使用,上述的登陸功能,接口以下
[HttpPost] public string GetCurrUserRealname() { var s = this.User.Identities.First(u => u.IsAuthenticated).FindFirst("realname").Value; var ss = this.User.Identity.Name; return ss + ":" + s; }
那在b.local.com 這個域名下怎麼訪問纔是有效的呢?
須要下面兩部操做
1.設置接口服務項目配置,以下操做
services.AddCors(options => options.AddPolicy("AllowSameDomain", builder => builder.WithOrigins("http://a.local.com:50307", "http://b.local.com:63455").AllowCredentials()));
2.ajax訪問接口時
$.ajax({ type: 'POST', url: "http://a.local.com:50307/Account/GetCurrUserRealname", data: null, dataType: "json", xhrFields: { withCredentials: true }, success: function (result) { $("#message").html(result); } });
ok,這樣就能夠訪問到當前登陸用戶的信息啦
本篇呢,寫的都是用例,理論原理,沒有涉及,也有一些其餘經常使用額擴展點,都沒有涉及到.
這裏我只是把一些的點,貼出來,但願對想入手core的同窗有所幫助.若有志同道合者,歡迎加左上方羣,一塊兒學習進步.