using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Net;
using System.Web;namespace Utility.OpenID
{/// <summary>/// Steam OpenID 管理器/// </summary>public class SteamOpenIDManager{private static string ApiKey = "8523A031BCC59CA8EB27075AA7F53648";private static string OpenIdURI = "https://steamcommunity.com/openid/login";/// <summary>/// 获取Http请求对象/// </summary>private static HttpRequest Request { get { return HttpContext.Current.Request; } }/// <summary>/// 创建Steam OpenID登录链接/// </summary>/// <param name="returnUrl">返回链接</param>/// <returns></returns>public static string BuildAuthUrl(string returnUrl){var authUrl = string.Empty;if (Request != null){string host = Request.Url.Scheme + "://" + Request.Url.Authority.Trim('/');StringBuilder sb = new StringBuilder();sb.Append(OpenIdURI);sb.Append("?");sb.AppendFormat("openid.ns={0}&", HttpUtility.UrlEncode("http://specs.openid.net/auth/2.0"));sb.AppendFormat("openid.mode=checkid_setup&");sb.AppendFormat("openid.return_to={0}&", HttpUtility.UrlEncode(host + "/" + returnUrl.Trim('/')));sb.AppendFormat("openid.realm={0}&", HttpUtility.UrlEncode(host));sb.AppendFormat("openid.identity={0}&", HttpUtility.UrlEncode("http://specs.openid.net/auth/2.0/identifier_select"));sb.AppendFormat("openid.claimed_id={0}", HttpUtility.UrlEncode("http://specs.openid.net/auth/2.0/identifier_select"));authUrl = sb.ToString();}return authUrl;}/// <summary>/// 是否从Steam登录返回/// </summary>/// <returns></returns>public static bool IsFromSteam(){if (Request != null){string a = Request.QueryString["openid.identity"],b = Request.QueryString["openid.response_nonce"],c = Request.QueryString["openid.assoc_handle"],d = Request.QueryString["openid.signed"],e = Request.QueryString["openid.sig"];if (Regex.IsMatch(a, "steamcommunity.com/openid/id/\\d+", RegexOptions.IgnoreCase) && !string.IsNullOrWhiteSpace(b) && !string.IsNullOrWhiteSpace(c) && !string.IsNullOrWhiteSpace(d) && !string.IsNullOrWhiteSpace(e)){return true;}}return false;}/// <summary>/// 验证OpenID登录返回数据/// </summary>/// <returns></returns>public static SteamOpenIDIdentity Verification(){SteamOpenIDIdentity identity = null;if (Request != null){string query = Regex.Replace(Request.Url.Query, "(?<=openid.mode=).+?(?=\\&)", "check_authentication", RegexOptions.IgnoreCase).Trim('?');try{WebClient client = new WebClient();client.Encoding = Encoding.UTF8;client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36";string result = client.UploadString(OpenIdURI, "POST", query);if (result.ToLower().Contains("is_valid:true")){identity = new SteamOpenIDIdentity();identity.SteamId = Regex.Match(HttpUtility.UrlDecode(Request.Url.Query), "(?<=openid/id/)\\d+", RegexOptions.IgnoreCase).Value;result = client.DownloadString("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=" + ApiKey + "&steamids=" + identity.SteamId);identity.Avatar = Regex.Match(result, "(?<=\"avatarfull\":\\s*?\").+?(?=\")", RegexOptions.IgnoreCase).Value;identity.Profile = Regex.Match(result, "(?<=\"profileurl\":\\s*?\").+?(?=\")", RegexOptions.IgnoreCase).Value;identity.UserName = Regex.Match(result, "(?<=\"personaname\":\\s*?\").+?(?=\")", RegexOptions.IgnoreCase).Value;identity.ReturnTo = new Uri(Request.QueryString["openid.return_to"]).PathAndQuery;}}catch (Exception ex) { }}return identity;}}/// <summary>/// Steam用户信息/// </summary>public class SteamOpenIDIdentity{public SteamOpenIDIdentity(){this.ReturnTo = "/";}/// <summary>/// 获取用户图像/// </summary>public string Avatar { set; get; }/// <summary>/// 获取用户中心地址/// </summary>public string Profile { set; get; }/// <summary>/// 获取Steam ID/// </summary>public string SteamId { set; get; }/// <summary>/// 获取用户名称/// </summary>public string UserName { set; get; }/// <summary>/// 获取返回地址/// </summary>public string ReturnTo { set; get; }}
}//登录
public ActionResult SteamLogin()
{string returnUrl = Url.RouteUrl("Profile");return Redirect(SteamOpenIDManager.BuildAuthUrl(returnUrl));
}//登录成功返回
public ActionResult Profile()
{if (SteamOpenIDManager.IsFromSteam()){#region OpenID验证SteamOpenIDIdentity identity = SteamOpenIDManager.Verification();if (identity != null){//登录处理逻辑}}return null;
}

网站使用第三方Steam帐号登录[OpenID]相关推荐

  1. [bhpyg] QQ互联接口 ,第三方帐号登录

    1.介绍 现在很多网站都集成了第三方帐号登录的功能,比如QQ登录.微信登录.微博登录. 使用第三方帐号登录目的,简化用户注册的流程,实现快速的注册登录. 第三方登录基本流程:①跳转到第三方认证页面 ② ...

  2. php curl登录,php curl实现第三方帐号登录

    今天帮学院写了个小网站,根据要求要用数字沈航帐号登录,还没办法与数字沈航的工作人员交流,无奈想出了个使用curl这个解决方案. 数字沈航(http://i.sau.edu.cn)是我们学校全部数字服务 ...

  3. apple帐号登录服务器端接入

    新博客地址(shankusu.me) 原文转载自 http://cwqqq.com/2020/09/27/apple_login_api_server_side apple帐号登录服务器端接入 最近有 ...

  4. 未成年帐号登录华为游戏,启动后不断弹出防沉迷提示

    问题描述 我们接入游戏SDK6.1.0.301版本之后,使用已实名未成年的帐号登录游戏后,弹出SDK防沉迷提示语"尊敬的用户,根据国家最新发布的游戏防沉迷规定,不满18岁的未成年人仅能在周五 ...

  5. 使用Google帐号登录Android应用

    需求 对于一个应用来说,帐号管理真是一件麻烦事,所以通过OAuth之类的使用第三方帐号登录是常见的做法.关于这个实现,在Web端有很多现成的解决方案.我之前发过的<RESTful客户端库:Res ...

  6. qwidget多个窗口同步_【好人BUG】本机多组控制 一台电脑使用一个帐号登录多个(省钱) !...

    一台电脑,可以用同一个好人帐号登录N个,达到控制一台电脑分组控制多个窗口同步操作. 这个好人BUG,你是否知道!给你省钱-->--> --------------------------- ...

  7. java session 数量_java中使用session监听实现同帐号登录限制、登录人数限制

    本文主要介绍了java中使用session监听实现同帐号登录限制.登录人数限制,具体代码如下: 问题域: 1.同帐号登录:若此帐号已登录,不可再次登录(与QQ模式相反). 2.登录人数限制,超过.已达 ...

  8. linux定时情况root mail,Linux_Linux系统下mail命令使用,我经常用root帐号登录RHEL5,在 - phpStudy...

    Linux系统下mail命令使用 我经常用root帐号登录RHEL5,在终端经常出现: You have new mail in /var/spool/mail/root 这肯定是系统给root超级管 ...

  9. 微信小程序:小程序内用户帐号登录规范调整和优化建议

    昨天晚上大概九点多,公众平台安全助手突然发来一条推送 <小程序内用户帐号登录规范调整通知> 粗略的看一眼推送,还以为自己的小程序被发警告信,惊吓出一身冷汗,迅速打开推送文章,细度一番才安下 ...

最新文章

  1. 影像融合操作的几种途径
  2. Spring Boot2.x-05Spring Boot基础-使用注解完成依赖注入
  3. utorrent设置上传速度_utorrent下载速度慢怎样设置 utorrent常用设置图文教程
  4. Halcon - 定位 - 卡尺
  5. dubbo超时重试和异常处理
  6. linux常用命令总结
  7. 使用windowManager实现音乐播放器(悬浮框)效果
  8. td过长,将固定宽度table撑开
  9. linux账号和权限管理思维导图,Linux系统支持的思维导图软件有哪些?
  10. kubernetes apiserver认证 1
  11. JS Cookies
  12. 物化视图(materialized view) 实现数据迁移、数据定时同步
  13. failed building wheel for termcolor_【零基础学Python】For循环和RANGE()函数
  14. RS-485通信协议简介
  15. 12v电量显示制作方法_12V电池电量指示电路
  16. 【RDMA】RDMA SEND/WRITE编程实例(IBV Verbs )
  17. 战争游戏红龙mod简介
  18. 2022 年排名前 10 的聊天机器人[示例]
  19. X特效 html+css+js
  20. ewebeditor漏洞之目录遍历漏洞

热门文章

  1. nginx中location匹配规则与proxy_pass代理转发
  2. react 页面跳转(下一页,返回上一页)
  3. JavaScript时间格式化
  4. 【安卓】电脑执行脚本控制安卓手机
  5. 7-24 猜数字游戏
  6. PHP函数计算中英文字符串长度的方法
  7. day55 虚拟机 centos linux命令 搭建linux架构师必背命令
  8. C++_MFC读视频文件
  9. 如何调整DOSBOX的运行窗口大小
  10. 0004-环保公益环保宣传PPT模板免费下载