سؤال

وأنا بناء تطبيق ويب باستخدام ASP.NET MVC التي لديها نوعين مختلفين جدا من المستخدمين. سوف تدبر مثال والقول بأن نوع واحد هو المنتجين المحتوى (الناشرين) وآخر هو المستهلكين المحتوى (مشترك).

وأنا لا تخطط لاستخدام المدمج في ASP.NET إذن الأشياء، لأن الفصل بين أنواع المستخدم بلدي هو الانقسام، سواء كنت ناشر أو مشترك، ليس على حد سواء. وهكذا، إذن البناء في أكثر تعقيدا مما كنت تحتاج إليها. بالإضافة إلى أنني أخطط على استخدام الخلية.

وكنت أفكر في تخزينها في نفس الجدول مع حقل التعداد (من الناحية الفنية حقل كثافة العمليات). ثم خلق CustomAuthorizationAttribute، حيث كنت تمر في نوع المستخدم بحاجة لهذه الصفحة.

وعلى سبيل المثال، فإن الصفحة PublishContent تتطلب نوع المستخدم == UserType.Publisher، وذلك فقط الناشرين يمكن الوصول إليه. لذلك، وخلق هذه السمة يعطيني الوصول إلى HttpContextBase، الذي يحتوي على الحقل العضو القياسية (من نوع IPrincipal). كيف يمكنني الحصول على حقل نوع المستخدم الخاص بي على هذا IPrincipal؟ لذلك، ثم السمة بلدي ستبدو:

public class PublisherAuthorizationAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (!httpContext.User.Identity.IsAuthenticated)
            return false;

        if (!httpContext.User.Identity.UserType == UserTypes.Publisher)
            return false;

        return true;
    }
}

وأو لا أحد يفكر معيب توجهي كله؟

هل كانت مفيدة؟

المحلول

وأود أن الاستمرار في استخدام المدمج في ASP.NET مصادقة النماذج ولكن فقط تخصيصه لاحتياجاتك.

وهكذا ستحتاج إلى الحصول على فئة المستخدم الخاص بك لتنفيذ واجهة IPrincipal ومن ثم كتابة بك معالجة ملفات تعريف الارتباط المخصصة. بعد ذلك يمكنك ببساطة مجرد استخدام بنيت في [تخويل] السمة.

وحاليا لدي شيء مشابه لما يلي ...

في بلدي global.asax

protected void Application_AuthenticateRequest()
{
    HttpCookie cookie = Request.Cookies.Get(FormsAuthentication.FormsCookieName);
    if (cookie == null)
        return;

    bool isPersistent;
    int webuserid = GetUserId(cookie, out isPersistent);

    //Lets see if the user exists
    var webUserRepository = Kernel.Get<IWebUserRepository>();

    try
    {
        WebUser current = webUserRepository.GetById(webuserid);

        //Refresh the cookie
        var formsAuth = Kernel.Get<IFormsAuthService>();

        Response.Cookies.Add(formsAuth.GetAuthCookie(current, isPersistent));
        Context.User = current;
    }
    catch (Exception ex)
    {
        //TODO: Logging
        RemoveAuthCookieAndRedirectToDefaultPage();
    }
}

private int GetUserId(HttpCookie cookie, out bool isPersistent)
{
    try
    {
        FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
        isPersistent = ticket.IsPersistent;
        return int.Parse(ticket.UserData);
    }
    catch (Exception ex)
    {
        //TODO: Logging

        RemoveAuthCookieAndRedirectToDefaultPage();
        isPersistent = false;
        return -1;
    }
}

وAccountController.cs

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult LogOn(LogOnForm logOnForm)
{
    try
    {
        if (ModelState.IsValid)
        {
            WebUser user = AccountService.GetWebUserFromLogOnForm(logOnForm);

            Response.Cookies.Add(FormsAuth.GetAuthCookie(user, logOnForm.RememberMe));

            return Redirect(logOnForm.ReturnUrl);
        }
    }
    catch (ServiceLayerException ex)
    {
        ex.BindToModelState(ModelState);
    }
    catch
    {
        ModelState.AddModelError("*", "There was server error trying to log on, try again. If your problem persists, please contact us.");
    }

    return View("LogOn", logOnForm);
}

وأخيرا بلدي FormsAuthService:

public HttpCookie GetAuthCookie(WebUser webUser, bool createPersistentCookie)
{
    var ticket = new FormsAuthenticationTicket(1,
                                               webUser.Email,
                                               DateTime.Now,
                                               DateTime.Now.AddMonths(1),
                                               createPersistentCookie,
                                               webUser.Id.ToString());

    string cookieValue = FormsAuthentication.Encrypt(ticket);

    var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieValue)
                         {
                             Path = "/"
                         };

    if (createPersistentCookie)
        authCookie.Expires = ticket.Expiration;

    return authCookie;
}

وHTHs
تشارلز

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top