Microsoft.Owin.Host.SystemWeb -
OWIN server that enables OWIN-based applications to run on IIS using the ASP.NET request pipeline.
使OWIN應用程式能在IIS上面運行
Microsoft.Owin.Security.Cookies -
Middleware that enables an application to use cookie based authentication, similar to ASP.NET's forms authentication.
使應用程式能使用 cookie based authentication, 像asp.net 的forms驗證
public class Startup { public void Configuration(IAppBuilder app) { app.UseCookieAuthentication(new CookieAuthenticationOptions { //作為辨識的的Cookie屬性 AuthenticationType = "ApplicationCookie", //如果無權限存取401 最後導頁的位置 LoginPath = new PathString("/Home/index") }); } }
這邊我們先讓所有畫面都需要經過驗證才能存取 建立個FilterConfig
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); filters.Add(new AuthorizeAttribute()); } }然後在我們的Global.asax 讓我們啟動程序時去做驗證 這樣我們每個畫面都需要經過我們的驗證才能顯示
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); }當然我們需要預設個登入的畫面 這畫面是[AllowAnonymous] 任何人都可以存取的畫面
[AllowAnonymous] public ActionResult Index() { return View(); }
然後建立我們 登入的ActionResult 驗證方法就自己看想怎寫 然後把
[HttpPost] public ActionResult LogIn(LogInModel model) { if (!ModelState.IsValid) { return View(); } // Don't do this in production! if (model.Email == "admin@admin.com" && model.Password == "password") { var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, "Ben"), new Claim(ClaimTypes.Email, "a@b.com"), new Claim(ClaimTypes.Country, "England") }, "ApplicationCookie"); var ctx = Request.GetOwinContext(); var authManager = ctx.Authentication; authManager.SignIn(identity); return RedirectToAction("Index", "Home"); }
1.首先建立了一個ClaimsIdentity object,這個物件包含目前使用者資訊。Claim架構提供Client一個持續驗證用的Cookie。
2.這邊也提供了authentication type,這必須要對應到在Startup中宣告的authentication type,兩者要相同。
3.接著從Owin Context 中取得IAuthenticationManager instance。會在startup過程中自動註冊。
4.接著呼叫IAuthenticationManager.SignIn傳送claims identity。這會設定Client端的authentication cookie。
5.最後把使用者的瀏覽器導回你想要的位置 這時候我們前端就可以 依照是否驗證過去判斷畫面
//如果登入了 @if (Request.IsAuthenticated) { //Corrent User 當前登入人的名稱 這裡是對應ClaimTypes.Name <li><a>@User.Identity.Name</a></li> <li><a href="@Url.Action(" logoff="" ome="">登出</a></li> } else { //還沒登入時的畫面 <li><a href="@Url.Action(" login="" ome="">登入</a></li> }
當然我們的ClaimsIdentity 還可以加入 ClaimTypes.Role 的部分 讓我們依照每個使用者的權限下去做是否有存取權限的判斷
[Authorize(Roles = "admin")]
沒有留言:
張貼留言