Design

Design
asp.net mvc

2017年5月17日 星期三

ASP.NET MVC Owin Identity 實作登入驗證

首先我們需要nuget兩個套件

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")]  

沒有留言:

張貼留言