Avatar
tomas
Člen
Avatar
tomas:

Dobrý den, řesím jeden problém. Předělávám firemní web z php na asp.net. Původná web běžel na posgresql, já tabulky převedl pod mssql. V původním web je tabulka uživatelů, kde jsou informace o uživatelích včetně jejich přihlašovacích údajů(heslo je ve tvaru md5). A teď k problému, nějak nevím jak udělat ověřování uživatelů. Všude co jsem se dočetl, tak se v ASP používají mamber provider, ale ty potřebují vytvořit vlastní tabulky. To já ale nepotřebuji, uživatele mám v db včetně všech údajů. Poradíte mě, jak vytvořit bezpečné přihlášení, které bude ověřovat uživatele vůči mé DB? Stačí nějaký návod či odkaz, kde bych zjistil jak se to řeší.

 
Odpovědět 16.1.2013 11:39
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na tomas
David Čápka:

Můžeš to přeci udělat úplně stejně jako v PHP.

Edit: Lepší je ale samozřejmě převést to do způsobu, co používá ASP. Ten MemberShip by měl jít upravit tak, aby sis ověřování údajů udělal sám. Použiješ tedy jen tu část co se stará o udržení relace.

Link na vytvoření vlastního: http://msdn.microsoft.com/…ary/ms366730(v=vs.100).aspx

Osobně bych tu DB asi převedl, je dobré jít stejnou cestou jako jde ASPčko.

Editováno 16.1.2013 12:01
Nahoru Odpovědět 16.1.2013 11:54
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
tomas
Člen
Avatar
Odpovídá na David Čápka
tomas:

Dík za tip, já bych to taky radeji prevedl, mam to i nachystany, ale neni to na mě. Hlavně je důležitý, že původní ID uživatelů jsou svázány v několika dalších tabulkách.

 
Nahoru Odpovědět 16.1.2013 12:20
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Myslel jsem si, že úplný převod z PostgreSQL do MSSQL není možný, protože PostgreSQL má hromadu rozšíření, ale pokud se ta rozšíření nepoužívají, tak by to jít mohlo.

Nahoru Odpovědět 16.1.2013 12:21
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na tomas
Kit:

Pokud data vyexportuješ přes XML, tak tě původní ID nemusí zajímat a do MSSQL to můžeš zase naimportovat.

Nahoru Odpovědět 16.1.2013 12:23
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
tomas
Člen
Avatar
tomas:

Tabulky už mám převedené v mssql. Udělal jsem aplikaci, která mě tabulky převedla a opravila vazby.

 
Nahoru Odpovědět 16.1.2013 12:28
Avatar
matesax
Redaktor
Avatar
Odpovídá na tomas
matesax:

Buď budeš ochoten pomocí programu - jednoduchého cyklu - přepsat data z tvé DB do takového uskupení, jaké používá MemberShipProvider a budeš mít jednodušší život - skoro o nic se nebudeš muset starat - a jak jsem psal - to přepsání by bylo jednoduché. Jakmile ale budeš dělat vlastní validaci, ztrácí smysl dělat to přes MemberShipProvider - to ti dá akorát více práce... Jednoduché UAC:

public class LogOnModel
{
        public string LNick { get; set; }

        public string LPassword { get; set; }

        public bool LRememberMe { get; set; }
}

[PropertiesMustMatch("NewPassword", "ConfirmPassword", ErrorMessage = "Heslo a ověřovací heslo se neshodují.")]
public class ChangePasswordModel
{
    [Required]
    [DataType(DataType.Password)]
    public string OldPassword { get; set; }

    [Required]
    [ValidatePasswordLength]
    [DataType(DataType.Password)]
    public string NewPassword { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string ConfirmPassword { get; set; }
}

[PropertiesMustMatch("Password", "ConfirmPassword", ErrorMessage = "Heslo a potvrzovací heslo se neshodují.")]
public class RegisterModel
{
    [Required]
    public string Nick { get; set; }

    [Required]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    [Required]
    [ValidatePasswordLength]
    [DataType(DataType.Password)]
    public string Password { get; set; }

[Required] - nutné a MustMatch snad nemusím překládat. Takže pak jen použiješ:

ModelState.IsValid

Což ověří první vlnu - shodují se údaje, co se mají shodovat a povinné údaje nejsou null.

Přihlášení:

[HttpPost]
public ActionResult Index(LogOnModel model)
{
    if (MembershipService.ValidateUser(model.LNick, model.LPassword))
    {
        FormsService.SignIn(model.LNick, model.LRememberMe);

        return RedirectToAction("Index");
    }
    else
        ViewData["LogIn"] = "The nick or password is incorrect.";

    return View(model);
}

Zde nevaliduji první vlnu - jelikož to mám řešené přes AJAX.

Takto vypadá registrace:

[HttpPost]
public ActionResult Registration(RegisterModel model)
{
        if (ModelState.IsValid)
        {
            MembershipCreateStatus createStatus = MembershipService.CreateUser(model.Nick, model.Password, model.Email);

            if (createStatus == MembershipCreateStatus.Success)
                {
                        FormsService.SignIn(model.Nick, model.RememberMe);
                        return RedirectToAction("Index", "Home");
                }
            else
                ModelState.AddModelError("", AccountValidation.ErrorCodeToString(createStatus));
        }

        return View(model);
}

Kde:

public bool ValidateUser(string nick, string password)
{
    if (String.IsNullOrEmpty(nick))
                throw new ArgumentException("Hodnota nemůže být prázdná.", "nick");

    if (String.IsNullOrEmpty(password))
                throw new ArgumentException("Hodnota nemůže být prázdná.", "password");

    return _provider.ValidateUser(nick, password);
}

A využívám databázi MySQL...

Editováno 16.1.2013 16:42
 
Nahoru Odpovědět 16.1.2013 16:41
Avatar
tomas
Člen
Avatar
Odpovídá na matesax
tomas:

Dík, moc mě to pomohlo.

 
Nahoru Odpovědět 17.1.2013 8:22
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.