Identity در ASP.NET Core ، یک سیستم عضویت است که قابلیت ورود به سیستم را به برنامه ‏های ASP.NET Core اضافه می‏کند.

کاربران می توانند با اطلاعات ورود به سیستم ذخیره شده در Identity یک حساب ایجاد کنند یا می توانند از یک ارائه دهنده ی( login provider) ورود خارجی استفاده کنند.

فراهم کننده های ورود به سیستم خارجی شامل Facebook، Google، Microsoft Account، و Twitter هستند.

Identity می تواند با استفاده از پایگاه داده ی SQL Server جهت ذخیره ی نام های کاربری، رمز عبورها، و داده های پروفایل پیکربندی شود.

همچنین، انباره ی پایدار دیگری می تواند مورد استفاده قرار بگیرد، برای مثال، Azure Table Storage.

کد نمونه را مشاهده یا دانلود کنید (نحوه ی دانلود).

در این مبحث، می آموزید که چگونه از Identity برای ثبت نام، ورود به سیستم، و خروج از سیستم یک کاربر استفاده کنید.

AddDefaultIdentity و AddIdentity

AddDefaultIdentity در ASP.NET Core 2.1 معرفی شد. فراخوانی AddDefaultIdentity مشابه فراخوانی های زیر است:

برای اطلاعات بیشتر، سورس/منبع AddDefaultIdentity را ببینید.

ایجاد یک برنامه ی Web با احراز هویت

یک پروژه ی ASP.NET Core Web Application با Individual User Accounts (حساب های کاربری مجزا) ایجاد کنید.

Identity در ASP.NET Core

Identity در ASP.NET Core

پروژه ی تولید شده ASP.NET Core Identity را به عنوان یک Razor Class Library ارائه میدهد.

Test Register و Login

برنامه را اجرا کرده و یک کاربر ثبت کنید. بسته به سایز صفحه ی شما، ممکن است نیاز باشد دکمه ی نوار ناوبری را برای دیدن پیوندهای Register و Login انتخاب کنید.

 

Identity در ASP.NET Core

Identity در ASP.NET Core

مشاهده ی پایگاه داده ی Identity

Identity در ASP.NET Core

Identity در ASP.NET Core

پیکربندی سرویس های Identity در ASP.NET Core

سرویس ها در ConfigureServices افزوده شده اند.

الگوی معمول، فراخوانی تمامی متدهای {Add{Service، و سپس فراخوانی تمامی متدهای {services.Configure{Service} است.

کد زیر CookiePolicyOptions تولید شده ی الگو را شامل نمی شود:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.Configure<IdentityOptions>(options =>
    {
        // Password settings.
        options.Password.RequireDigit = true;
        options.Password.RequireLowercase = true;
        options.Password.RequireNonAlphanumeric = true;
        options.Password.RequireUppercase = true;
        options.Password.RequiredLength = 6;
        options.Password.RequiredUniqueChars = 1;

        // Lockout settings.
        options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
        options.Lockout.MaxFailedAccessAttempts = 5;
        options.Lockout.AllowedForNewUsers = true;

        // User settings.
        options.User.AllowedUserNameCharacters =
        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
        options.User.RequireUniqueEmail = false;
    });

    services.ConfigureApplicationCookie(options =>
    {
        // Cookie settings
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

        options.LoginPath = "/Identity/Account/Login";
        options.AccessDeniedPath = "/Identity/Account/AccessDenied";
        options.SlidingExpiration = true;
    });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

کد پیشین، Identity را با مقادیر گزینه ی پیش فرض پیکربندی می کند.

سرویس ها از طریق تزریق وابستگی در دسترس برنامه قرار می گیرند.

Identity با فراخوانی UseAuthentication فعال می شود. UseAuthentication میان افزار احراز هویت را به خط لوله ی درخواست اضافه می کند.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseAuthentication();

    app.UseMvc();
}

برای اطلاعات بیشتر، IdentityOptions Class و Application Startup را ببینید.

(Scaffold) چارچوب بندی Register، Login، و LogOut

دستورالعمل های چارچوب بندی Identity به یک پروژه ی Razor با تأیید را برای تولید کد نشان داده شده در این بخش دنبال کنید.

Identity در ASP.NET Core

Identity در ASP.NET Core

بررسی Register (ثبت نام)

هنگامیکه یک کاربر پیوند Register را کلیک می کند، عمل RegisterModel.OnPostAsync فراخوانی می شود.

کاربر توسط CreateAsync در شیء _userManager ایجاد می شود. (_userManager توسط تزریق وابستگی ارائه می شود):

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");
    if (ModelState.IsValid)
    {
        var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
        var result = await _userManager.CreateAsync(user, Input.Password);
        if (result.Succeeded)
        {
            _logger.LogInformation("User created a new account with password.");

            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
            var callbackUrl = Url.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { userId = user.Id, code = code },
                protocol: Request.Scheme);

            await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

            await _signInManager.SignInAsync(user, isPersistent: false);
            return LocalRedirect(returnUrl);
        }
        foreach (var error in result.Errors)
        {
            ModelState.AddModelError(string.Empty, error.Description);
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

اگر کاربر با موفقیت ایجاد شد، کاربر توسط فراخوانی _signInManager.SignInAsync وارد سیستم می شود.

نکته: تأیید حساب را برای مراحل جلوگیری از ورود فوری به سیستم در زمان ثبت نام ببینید.

Log in (ورود به سیستم)

فرم Login زمانی نمایش داده میشود که:

  •  پیوند Log in انتخاب شود.
  •  کاربری سعی کند به صفحه ای محدود شده/ممنوعه دسترسی پیدا کند که دسترسی آن ها تأیید نشده یا زمانیکه توسط سیستم تأیید نشده اند.

زمانیکه فرم صفحه ی Login ارائه شد، عمل OnPostAsync فراخوانی می شود.

PasswordSignInAsync در شیء _signInManager فراخوانی می شود (ارائه شده توسط تزریق وابستگی).

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");

    if (ModelState.IsValid)
    {
        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, 
        // set lockoutOnFailure: true
        var result = await _signInManager.PasswordSignInAsync(Input.Email, 
            Input.Password, Input.RememberMe, lockoutOnFailure: true);
        if (result.Succeeded)
        {
            _logger.LogInformation("User logged in.");
            return LocalRedirect(returnUrl);
        }
        if (result.RequiresTwoFactor)
        {
            return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl,
                RememberMe = Input.RememberMe });
        }
        if (result.IsLockedOut)
        {
            _logger.LogWarning("User account locked out.");
            return RedirectToPage("./Lockout");
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return Page();
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

کلاس Controller پایه یک ویژگی User را نمایان می سازد که می توانید از طریق متدهای کنترل کننده به آن دسترسی پیدا کنید.

برای نمونه، می توانید User.Claims را شمرده و تصمیماتی در رابطه با احراز هویت بگیرید.

برای اطلاعات بیشتر، مقدمه ای بر تأیید در ASP.NET Core را ببینید.

Log Out (خروج از سیستم)

پیوند Log out عمل LogoutModel.OnPost را فراخوانی می کند.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;

namespace WebApp1.Areas.Identity.Pages.Account
{
    [AllowAnonymous]
    public class LogoutModel : PageModel
    {
        private readonly SignInManager<IdentityUser> _signInManager;
        private readonly ILogger<LogoutModel> _logger;

        public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger)
        {
            _signInManager = signInManager;
            _logger = logger;
        }

        public void OnGet()
        {
        }

        public async Task<IActionResult> OnPost(string returnUrl = null)
        {
            await _signInManager.SignOutAsync();
            _logger.LogInformation("User logged out.");
            if (returnUrl != null)
            {
                return LocalRedirect(returnUrl);
            }
            else
            {
                return Page();
            }
        }
    }
}

SignOutAsync ، ادعاه ا( claims)  ذخیره شده ی کاربر در یک کوکی (cookie) را پاک می کند.

پس از فراخوانی SignOutAsync، redirect (هدایت مجدد) نکنید، اگر نه کاربر از سیستم خارج نخواهد شد.

پست در Pages/Shared/_LoginPartial.cshtml نشان داده شده است:

@using Microsoft.AspNetCore.Identity

@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager

@if (SignInManager.IsSignedIn(User))
{
    
<form asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Page("/Index", new { area = "" })" method="post" id="logoutForm" class="navbar-right">
        
<ul class="nav navbar-nav navbar-right">
            
<li>
                <a asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">
                          Hello @UserManager.GetUserName(User)!</a>
            </li>

            
<li>
                <button type="submit" class="btn btn-link navbar-btn navbar-link">Logout</button>
            </li>

        </ul>

    </form>

}
else
{
    
<ul class="nav navbar-nav navbar-right">
        
<li><a asp-area="Identity" asp-page="/Account/Register">Register</a></li>

        
<li><a asp-area="Identity" asp-page="/Account/Login">Login</a></li>

    </ul>

}

آزمون Identity در ASP.NET Core

قالب های پروژه ی وب پیش فرض دسترسی ناشناس به صفحات خانه را مجاز می کنند. جهت آزمودن Identity، [Authorize] را به صفحه ی About اضافه کنید.

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace WebApp1.Pages
{
    [Authorize]
    public class AboutModel : PageModel
    {
        public string Message { get; set; }

        public void OnGet()
        {
            Message = "Your application description page.";
        }
    }
}

اگر وارد سیستم شده اید، خارج شوید. برنامه را اجرا کرده و پیوند About را انتخاب کنید. به صفحه ی ورود به سیستم هدایت می شوید.

جستجوی Identity در ASP.NET Core

برای جستجوی Identity، با جزئیات بیشتر:

اجزا/کامپوننت های Identity در ASP.NET Core

تمامی پکیج های NuGet وابسته به Identity در متاپکیج های Microsoft.AspNetCore.App گنجانده شده اند.

پکیج اصلی برای Identity، Microsoft.AspNetCore.Identity است. این پکیج حاوی مجموعه (core) هسته ی رابط ها برای ASP.NET Core Identity است، و Microsoft.AspNetCore.Identity.EntityFrameworkCore آن را شامل می شود.

مهاجرت/انتقال به ASP.NET Core Identity

برای اطلاعات بیشتر و راهنمایی در رابطه با انتقال فروشگاه/انبار Identity موجود خود، Migrate Authentication and Identity (انتقال احراز هویت و Identity) را ببینید.

تعیین و تنظیم قدرت رمز عبور

Configuraion (پیکربندی) را برای نمونه ای که حداقل نیازمندی های رمز عبور را تنظیم می کند، ببینید.

زهره سلطانیان

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.