Maison développement back-end Tutoriel C#.Net Explication détaillée de l'exemple de conception d'authentification unique ASP.NET MVC SSO

Explication détaillée de l'exemple de conception d'authentification unique ASP.NET MVC SSO

Jul 03, 2017 pm 05:28 PM
asp.net 登录 设计

Cet article présente principalement la conception et la mise en œuvre de l'authentification unique ASP.NET MVC SSO. Il a une certaine valeur de référence. Ceux qui sont intéressés peuvent en savoir plus.

Configuration de l'environnement expérimental

La configuration du fichier HOST est la suivante :

127.0.0.1 app.com
127.0.0.1 sso.com

La configuration IIS est la suivante :

Le pool d'applications utilise .Net Framework 4.0

Faites attention aux noms de domaine liés à IIS, deux noms de domaine complètement différents.

La configuration du site app.com est la suivante :

La configuration du site sso.com est la suivante :

memcachedCache :

Configuration de la base de données :

La base de données utilise EntityFramework 6.0, la base de données et la structure de table correspondantes seront automatiquement créées lors de la première exécution.

Démonstration du processus de vérification de l'autorisation :

Visitez : http://app.com dans la barre d'adresse du navigateur Si l'utilisateur ne s'est pas connecté, le site Web s'ouvrira automatiquement. redirect Accédez à : http://sso.com/passport et transmettez l'ID d'application AppKey correspondant via les paramètres QueryString. La capture d'écran en cours d'exécution est la suivante :

Adresse URL : http://sso.com/passport. ?appkey=670b14728ad9902aecba32e22fa4f6bd&username=

Après avoir entré le compte de connexion et le mot de passe corrects, cliquez sur le bouton de connexion et le système sera automatiquement redirigé vers l'application et la page d'accueil disparaîtra après. la destruction est réussie, comme indiqué ci-dessous :

Étant donné que la connexion par autorisation SSO est effectuée sous différents domaines, la méthode QueryString est utilisée pour renvoyer l'ID d'autorisation. Les cookies peuvent être utilisés sur des sites Web du même domaine. Puisque la demande de redirection 301 est envoyée par le navigateur, si l'identifiant d'autorisation est placé dans Handers, il sera perdu lors de la redirection du navigateur. Une fois la redirection réussie, le programme écrit automatiquement la marque d'autorisation dans le cookie. Lorsque vous cliquez sur d'autres adresses de page, les informations de la marque d'autorisation ne seront plus visibles dans la barre d'adresse URL. Les paramètres des cookies sont les suivants :

Vérification ultérieure de l'autorisation après une connexion réussie (accès à d'autres pages nécessitant une autorisation) :

Adresse de vérification : http:// sso.com/api/passport?sessionkey=xxxxxx&remark=xxxxxx

Résultats de retour : vrai, faux

Le client peut choisir de demander à l'utilisateur une autorisation en fonction de la situation commerciale réelle est perdue et doit être réautorisée. Par défaut, il est automatiquement redirigé vers la page de connexion SSO, à savoir : http://sso.com/passport?appkey=670b14728ad9902aecba32e22fa4f6bd&username=seo@ljja.cn. En même temps, la zone de texte de l'adresse e-mail sur la page de connexion s'affichera. Complétez automatiquement le compte de connexion de l'utilisateur. Il suffit à l'utilisateur de saisir le mot de passe de connexion. Après une autorisation réussie, la période de validité de la session sera automatiquement prolongée d'un an.

Journal de vérification de la base de données SSO :

Journal de vérification de l'autorisation de l'utilisateur :

Session d'autorisation de l'utilisateur Session :

Compte utilisateur de la base de données et informations sur l'application :

Code principal de la page de vérification de la connexion à l'autorisation de l'application :


/// <summary>
  /// 公钥:AppKey
  /// 私钥:AppSecret
  /// 会话:SessionKey
  /// </summary>
  public class PassportController : Controller
  {
    private readonly IAppInfoService _appInfoService = new AppInfoService();
    private readonly IAppUserService _appUserService = new AppUserService();
    private readonly IUserAuthSessionService _authSessionService = new UserAuthSessionService();
    private readonly IUserAuthOperateService _userAuthOperateService = new UserAuthOperateService();

    private const string AppInfo = "AppInfo";
    private const string SessionKey = "SessionKey";
    private const string SessionUserName = "SessionUserName";

    //默认登录界面
    public ActionResult Index(string appKey = "", string username = "")
    {
      TempData[AppInfo] = _appInfoService.Get(appKey);

      var viewModel = new PassportLoginRequest
      {
        AppKey = appKey,
        UserName = username
      };

      return View(viewModel);
    }

    //授权登录
    [HttpPost]
    public ActionResult Index(PassportLoginRequest model)
    {
      //获取应用信息
      var appInfo = _appInfoService.Get(model.AppKey);
      if (appInfo == null)
      {
        //应用不存在
        return View(model);
      }

      TempData[AppInfo] = appInfo;

      if (ModelState.IsValid == false)
      {
        //实体验证失败
        return View(model);
      }

      //过滤字段无效字符
      model.Trim();

      //获取用户信息
      var userInfo = _appUserService.Get(model.UserName);
      if (userInfo == null)
      {
        //用户不存在
        return View(model);
      }

      if (userInfo.UserPwd != model.Password.ToMd5())
      {
        //密码不正确
        return View(model);
      }

      //获取当前未到期的Session
      var currentSession = _authSessionService.ExistsByValid(appInfo.AppKey, userInfo.UserName);
      if (currentSession == null)
      {
        //构建Session
        currentSession = new UserAuthSession
        {
          AppKey = appInfo.AppKey,
          CreateTime = DateTime.Now,
          InvalidTime = DateTime.Now.AddYears(1),
          IpAddress = Request.UserHostAddress,
          SessionKey = Guid.NewGuid().ToString().ToMd5(),
          UserName = userInfo.UserName
        };

        //创建Session
        _authSessionService.Create(currentSession);
      }
      else
      {
        //延长有效期,默认一年
        _authSessionService.ExtendValid(currentSession.SessionKey);
      }

      //记录用户授权日志
      _userAuthOperateService.Create(new UserAuthOperate
      {
        CreateTime = DateTime.Now,
        IpAddress = Request.UserHostAddress,
        Remark = string.Format("{0} 登录 {1} 授权成功", currentSession.UserName, appInfo.Title),
        SessionKey = currentSession.SessionKey
      }); 104 
      var redirectUrl = string.Format("{0}?SessionKey={1}&SessionUserName={2}",
        appInfo.ReturnUrl, 
        currentSession.SessionKey, 
        userInfo.UserName);

      //跳转默认回调页面
      return Redirect(redirectUrl);
    }
  }
Memcached会话标识验证核心代码:
public class PassportController : ApiController
  {
    private readonly IUserAuthSessionService _authSessionService = new UserAuthSessionService();
    private readonly IUserAuthOperateService _userAuthOperateService = new UserAuthOperateService();

    public bool Get(string sessionKey = "", string remark = "")
    {
      if (_authSessionService.GetCache(sessionKey))
      {
        _userAuthOperateService.Create(new UserAuthOperate
        {
          CreateTime = DateTime.Now,
          IpAddress = Request.RequestUri.Host,
          Remark = string.Format("验证成功-{0}", remark),
          SessionKey = sessionKey
        });

        return true;
      }

      _userAuthOperateService.Create(new UserAuthOperate
      {
        CreateTime = DateTime.Now,
        IpAddress = Request.RequestUri.Host,
        Remark = string.Format("验证失败-{0}", remark),
        SessionKey = sessionKey
      });

      return false;
    }
  }
Copier après la connexion

Attribut des filtres de vérification d'autorisation client


public class SSOAuthAttribute : ActionFilterAttribute
  {
    public const string SessionKey = "SessionKey";
    public const string SessionUserName = "SessionUserName";

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
      var cookieSessionkey = "";
      var cookieSessionUserName = "";

      //SessionKey by QueryString
      if (filterContext.HttpContext.Request.QueryString[SessionKey] != null)
      {
        cookieSessionkey = filterContext.HttpContext.Request.QueryString[SessionKey];
        filterContext.HttpContext.Response.Cookies.Add(new HttpCookie(SessionKey, cookieSessionkey));
      }

      //SessionUserName by QueryString
      if (filterContext.HttpContext.Request.QueryString[SessionUserName] != null)
      {
        cookieSessionUserName = filterContext.HttpContext.Request.QueryString[SessionUserName];
        filterContext.HttpContext.Response.Cookies.Add(new HttpCookie(SessionUserName, cookieSessionUserName));
      }

      //从Cookie读取SessionKey
      if (filterContext.HttpContext.Request.Cookies[SessionKey] != null)
      {
        cookieSessionkey = filterContext.HttpContext.Request.Cookies[SessionKey].Value;
      }

      //从Cookie读取SessionUserName
      if (filterContext.HttpContext.Request.Cookies[SessionUserName] != null)
      {
        cookieSessionUserName = filterContext.HttpContext.Request.Cookies[SessionUserName].Value;
      }

      if (string.IsNullOrEmpty(cookieSessionkey) || string.IsNullOrEmpty(cookieSessionUserName))
      {
        //直接登录
        filterContext.Result = SsoLoginResult(cookieSessionUserName);
      }
      else
      {
        //验证
        if (CheckLogin(cookieSessionkey, filterContext.HttpContext.Request.RawUrl) == false)
        {
          //会话丢失,跳转到登录页面
          filterContext.Result = SsoLoginResult(cookieSessionUserName);
        }
      }

      base.OnActionExecuting(filterContext);
    }

    public static bool CheckLogin(string sessionKey, string remark = "")
    {
      var httpClient = new HttpClient
      {
        BaseAddress = new Uri(ConfigurationManager.AppSettings["SSOPassport"])
      };

      var requestUri = string.Format("api/Passport?sessionKey={0}&remark={1}", sessionKey, remark);

      try
      {
        var resp = httpClient.GetAsync(requestUri).Result;

        resp.EnsureSuccessStatusCode();

        return resp.Content.ReadAsAsync<bool>().Result;
      }
      catch (Exception ex)
      {
        throw ex;
      }
    }

    private static ActionResult SsoLoginResult(string username)
    {
      return new RedirectResult(string.Format("{0}/passport?appkey={1}&username={2}",
          ConfigurationManager.AppSettings["SSOPassport"],
          ConfigurationManager.AppSettings["SSOAppKey"],
          username));
    }
  }
Copier après la connexion

Exemple d'utilisation de la fonctionnalité de vérification SSO :


[SSOAuth]
  public class HomeController : Controller
  {
    public ActionResult Index()
    {
      return View();
    }

    public ActionResult About()
    {
      ViewBag.Message = "Your application description page.";

      return View();
    }

    public ActionResult Contact()
    {
      ViewBag.Message = "Your contact page.";

      return View();
    }
  }
Copier après la connexion

Résumé :

À partir du brouillon d'exemple de code, vous pouvez voir qu'il existe encore de nombreux domaines d'optimisation pour le code performances. Il existe également une série de messages d'invite tels que le compte utilisateur sur la page de connexion d'autorisation de l'application SSO n'existe pas, le mot de passe est incorrect, etc. À un stade ultérieur, lorsque le code métier s'exécute fondamentalement correctement, vous pouvez envisager d'optimiser davantage de niveaux de sécurité, par exemple en activant la vérification de la signature de clé privée AppSecret, la vérification de la plage IP, l'attaque par demande de session fixe et le code de vérification du Interface de connexion d'autorisation SSO, reconstruction automatique du cache de session, expansion horizontale du serveur SSo, du cache, etc.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Que dois-je faire si je télécharge les fonds d'écran d'autres personnes après m'être connecté à un autre compte sur WallpaperEngine ? Que dois-je faire si je télécharge les fonds d'écran d'autres personnes après m'être connecté à un autre compte sur WallpaperEngine ? Mar 19, 2024 pm 02:00 PM

Lorsque vous vous connectez au compte Steam de quelqu'un d'autre sur votre ordinateur et que le compte de cette autre personne dispose d'un logiciel de fond d'écran, Steam téléchargera automatiquement les fonds d'écran abonnés au compte de l'autre personne après être revenu à votre propre compte. Les utilisateurs peuvent résoudre ce problème en. désactiver la synchronisation du cloud Steam. Que faire si WallpaperEngine télécharge les fonds d'écran d'autres personnes après s'être connecté à un autre compte 1. Connectez-vous à votre propre compte Steam, recherchez la synchronisation cloud dans les paramètres et désactivez la synchronisation cloud Steam. 2. Connectez-vous au compte Steam de quelqu'un d'autre auquel vous vous êtes connecté auparavant, ouvrez Wallpaper Creative Workshop, recherchez le contenu de l'abonnement, puis annulez tous les abonnements. (Si vous ne trouvez pas le fond d'écran à l'avenir, vous pouvez d'abord le récupérer, puis annuler l'abonnement) 3. Revenez à votre propre Steam

Comment puis-je me connecter à mon ancien compte sur Xiaohongshu ? Que dois-je faire si le numéro d'origine est perdu après sa reconnexion ? Comment puis-je me connecter à mon ancien compte sur Xiaohongshu ? Que dois-je faire si le numéro d'origine est perdu après sa reconnexion ? Mar 21, 2024 pm 09:41 PM

Avec le développement rapide des médias sociaux, Xiaohongshu est devenue une plateforme populaire permettant à de nombreux jeunes de partager leur vie et d'explorer de nouveaux produits. Pendant l'utilisation, les utilisateurs peuvent parfois rencontrer des difficultés pour se connecter aux comptes précédents. Cet article expliquera en détail comment résoudre le problème de connexion à l'ancien compte sur Xiaohongshu et comment gérer la possibilité de perdre le compte d'origine après avoir modifié la liaison. 1. Comment se connecter au compte précédent de Xiaohongshu ? 1. Récupérez le mot de passe et connectez-vous. Si vous ne vous connectez pas à Xiaohongshu pendant une longue période, votre compte peut être recyclé par le système. Afin de restaurer les droits d'accès, vous pouvez tenter de vous reconnecter à votre compte en récupérant votre mot de passe. Les étapes de fonctionnement sont les suivantes : (1) Ouvrez l'application Xiaohongshu ou le site officiel et cliquez sur le bouton « Connexion ». (2) Sélectionnez « Récupérer le mot de passe ». (3) Entrez le numéro de téléphone mobile que vous avez utilisé lors de l'enregistrement de votre compte

Le Wi-Fi portable ZTE 5G U50S est mis en vente au prix de 899 NT$ lors du premier lancement : vitesse maximale de 500 Mbps Le Wi-Fi portable ZTE 5G U50S est mis en vente au prix de 899 NT$ lors du premier lancement : vitesse maximale de 500 Mbps Apr 26, 2024 pm 03:46 PM

Selon les informations du 26 avril, le Wi-Fi portable 5G U50S de ZTE est désormais officiellement en vente, à partir de 899 yuans. En termes de conception d'apparence, le Wi-Fi portable ZTE U50S est simple et élégant, facile à tenir et à emballer. Sa taille est de 159/73/18 mm et est facile à transporter, vous permettant de profiter du réseau haut débit 5G à tout moment et en tout lieu, offrant ainsi une expérience de bureau mobile et de divertissement sans entrave. Le ZTE 5G portable Wi-Fi U50S prend en charge le protocole avancé Wi-Fi 6 avec un débit de pointe allant jusqu'à 1 800 Mbps. Il s'appuie sur la plate-forme 5G hautes performances Snapdragon X55 pour offrir aux utilisateurs une expérience réseau extrêmement rapide. Non seulement il prend en charge l'environnement réseau bimode 5G SA+NSA et la bande de fréquences inférieure à 6 GHz, mais la vitesse du réseau mesurée peut même atteindre un étonnant 500 Mbps, ce qui est facilement satisfaisant.

Tendance rétro ! HMD et Heineken lancent conjointement un téléphone à clapet : une coque transparente Tendance rétro ! HMD et Heineken lancent conjointement un téléphone à clapet : une coque transparente Apr 17, 2024 pm 06:50 PM

Selon les informations du 17 avril, HMD s'est associé à la célèbre marque de bière Heineken et à la société créative Bodega pour lancer un téléphone à clapet unique : The Boring Phone. Ce téléphone est non seulement plein d'innovation dans le design, mais revient également à la nature en termes de fonctionnalité, dans le but de ramener les gens à de véritables interactions interpersonnelles et à profiter du pur moment de boire entre amis. Le téléphone mobile ennuyeux adopte un design à rabat transparent unique, montrant une esthétique simple mais élégante. Il est équipé d'un écran QVGA de 2,8 pouces à l'intérieur et d'un écran de 1,77 pouces à l'extérieur, offrant aux utilisateurs une expérience d'interaction visuelle de base. Côté photographie, bien qu'il ne soit équipé que d'un appareil photo de 30 mégapixels, celui-ci suffit pour gérer des tâches simples du quotidien.

Comment accéder à la version Web de Baidu Netdisk ? Entrée de connexion à la version Web de Baidu Netdisk Comment accéder à la version Web de Baidu Netdisk ? Entrée de connexion à la version Web de Baidu Netdisk Mar 13, 2024 pm 04:58 PM

Baidu Netdisk peut non seulement stocker diverses ressources logicielles, mais également les partager avec d'autres. Il prend en charge la synchronisation multi-terminal. Si aucun client n'est téléchargé sur votre ordinateur, vous pouvez choisir d'accéder à la version Web. Alors, comment se connecter à la version Web de Baidu Netdisk ? Jetons un coup d’œil à l’introduction détaillée. Entrée de connexion à la version Web de Baidu Netdisk : https://pan.baidu.com (copiez le lien vers le navigateur pour l'ouvrir) Introduction au logiciel 1. Partage Fournit une fonction de partage de fichiers, les utilisateurs peuvent organiser des fichiers et les partager avec des amis dans le besoin. 2. Cloud : il ne prend pas trop de mémoire. La plupart des fichiers sont enregistrés dans le cloud, ce qui permet d'économiser efficacement de l'espace informatique. 3. Album photo : prend en charge la fonction d'album photo cloud, importe des photos sur le disque cloud, puis les organise pour que tout le monde puisse les voir.​

Comment se connecter si Xiaohongshu se souvient uniquement du compte ? Je me souviens juste comment récupérer mon compte ? Comment se connecter si Xiaohongshu se souvient uniquement du compte ? Je me souviens juste comment récupérer mon compte ? Mar 23, 2024 pm 05:31 PM

Xiaohongshu est désormais intégré dans la vie quotidienne de nombreuses personnes, et son contenu riche et ses méthodes de fonctionnement pratiques en font profiter les utilisateurs. Parfois, nous pouvons oublier le mot de passe du compte. Il est vraiment ennuyeux de se souvenir uniquement du compte sans pouvoir se connecter. 1. Comment se connecter si Xiaohongshu se souvient uniquement du compte ? Lorsque nous oublions notre mot de passe, nous pouvons nous connecter à Xiaohongshu via le code de vérification sur notre téléphone mobile. Les opérations spécifiques sont les suivantes : 1. Ouvrez l'application Xiaohongshu ou la version Web de Xiaohongshu ; 2. Cliquez sur le bouton « Connexion » et sélectionnez « Connexion au compte et au mot de passe » 3. Cliquez sur le bouton « Mot de passe oublié ? . Entrez votre numéro de compte. Cliquez sur « Suivant » ; 5. Le système enverra un code de vérification sur votre téléphone mobile, entrez le code de vérification et cliquez sur « OK » ; 6. Définissez un nouveau mot de passe et confirmez. Vous pouvez également utiliser un compte tiers (tel que

Honor Magic V3 lance la technologie de protection oculaire anti-focalisation AI : atténue efficacement le développement de la myopie Honor Magic V3 lance la technologie de protection oculaire anti-focalisation AI : atténue efficacement le développement de la myopie Jul 18, 2024 am 09:27 AM

Selon les informations du 12 juillet, la série Honor Magic V3 a été officiellement lancée aujourd'hui, équipée du nouvel écran de protection oculaire Honor Vision Soothing Oasis. Bien que l'écran lui-même ait des spécifications élevées et une haute qualité, il a également été le pionnier de l'introduction de la protection oculaire active AI. technologie. Il est rapporté que les « lunettes de myopie » sont le moyen traditionnel de soulager la myopie. La puissance des lunettes de myopie est uniformément répartie pour garantir que la zone centrale de la vue est imagée sur la rétine, mais la zone périphérique est imagée derrière la rétine. La rétine sent que l'image est derrière, favorisant la direction de l'axe de l'œil plus tard, approfondissant ainsi le degré. À l'heure actuelle, l'un des principaux moyens d'atténuer le développement de la myopie est la « lentille de défocalisation ». La zone centrale a une puissance normale et la zone périphérique est ajustée au moyen de cloisons de conception optique, de sorte que l'image dans la zone périphérique tombe dans l'image. devant la rétine.

Que dois-je faire si je ne parviens pas à me connecter à mon compte sur Google Chrome ? Solution pour laquelle le compte Google Chrome ne peut pas être connecté Que dois-je faire si je ne parviens pas à me connecter à mon compte sur Google Chrome ? Solution pour laquelle le compte Google Chrome ne peut pas être connecté Mar 13, 2024 pm 02:10 PM

Que dois-je faire si je ne parviens pas à me connecter à mon compte sur Google Chrome ? Lorsque de nombreux utilisateurs utilisent ce logiciel, certaines fonctions nécessitent que les utilisateurs se connectent à leur compte Google avant de pouvoir l'utiliser. Cependant, ils ont essayé à plusieurs reprises mais n'ont pas réussi à se connecter. Face à ce problème, de nombreux utilisateurs ne savent pas comment le faire. résolvez-le, donc dans ce numéro, l'éditeur est là pour partager la solution avec vous. J'espère que le contenu du didacticiel logiciel d'aujourd'hui pourra être utile à tout le monde. La solution est la suivante : 1. Cliquez sur un navigateur sur le bureau et après l'avoir ouvert, vous verrez quelque chose comme ceci. 2. Si la connexion apparaît à ce moment-là, cliquez dessus. Si vous ne la voyez pas, cliquez sur le coin supérieur droit. 3. Cliquez sur Connexion, puis entrez votre numéro de compte. Vous n'avez pas besoin de saisir le compte après @, puis cliquez sur Suivant. 4. Entrez le mot de passe. Lorsque vous voyez cette invite, cliquez sur Activer.

See all articles