ASP.NET MVC网站使用新浪微博账号登录
首先到http://open.weibo.com/development 注册一个开发者账号。
然后可以点微连接--网站接入



会分配App Key 和App Secret

然后点高级信息

在这里设置回调地址

这里的回调地址不能用localhost,后面再说怎么来设置这个

新建web项目


为了方便调试,在项目属性的Web中选择本地IIS

保存会提示创建虚拟目录

注意:如果是用本地IIS的话,需要把数据库连接改下,不能用程序自带的LocalDB
运行即可看到页面

此时需要请出一款神器:ngrok
下载后解压,命令行到解压目录,运行
ngrok -config=ngrok.cfg -subdomain mywebapp

在浏览器访问:http://mywebapp.tunnel.qydev.com/MyWebApp/

好了,这个时候再来设置回调地址:

修改Views--Account 下的_ExternalLoginsListPartial.cshtml
@model MyWebApp.Models.ExternalLoginListViewModel
@using Microsoft.Owin.Security
<h4>使用其他服务登录。</h4>
<hr />
@{
using (Html.BeginForm("ExternalLogin", "Account", new { ReturnUrl = Model.ReturnUrl }))
{
@Html.AntiForgeryToken()
<div id="socialLoginList">
<p>
<button type="submit" class="btn btn-default" id="" name="provider" value="" title="使用你的 微博 帐户登录">微博登录</button>
</p>
</div>
}
}
修改AccountController--ExternalLogin
public ActionResult ExternalLogin(string provider, string returnUrl)
{
// 请求重定向到外部登录提供程序
string url = "https://api.weibo.com/oauth2/authorize?client_id=xxx&response_type=code&redirect_uri=http://mywebapp.tunnel.qydev.com/MyWebApp/Account/ExternalLoginCallback";
return Redirect(url);
//return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl }));
}
这里的client_id就是上面微博分配的App Key
修改ExternalLoginCallback
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
string appKey = "app key";
string appSecret = "app secret";
string code = Request["code"];
string url = string.Format("https://api.weibo.com/oauth2/access_token");
string callBack = "http://mvctest.tunnel.qydev.com/MvcWebApp/Account/ExternalLoginCallback";
NameValueCollection collection = new NameValueCollection();
collection.Add("client_id", appKey);
collection.Add("client_secret", appSecret);
collection.Add("grant_type", "authorization_code");
collection.Add("code", code);
collection.Add("redirect_uri", callBack);
try
{
using (WebClient client = new WebClient())
{
client.Encoding = Encoding.UTF8;
byte[] response = client.UploadValues(url, collection);
var returnStr = Encoding.UTF8.GetString(response);
OAuthEntity oauth = JsonConvert.DeserializeObject<OAuthEntity>(returnStr);
//获取用户信息
string userUrl = string.Format("https://api.weibo.com/2/users/show.json?access_token={0}&uid={1}", oauth.access_token, oauth.uid);
var userInfo = client.DownloadString(userUrl);
SinaUser sinaUser = JsonConvert.DeserializeObject<SinaUser>(userInfo);
UserLoginInfo login = new UserLoginInfo("sina", sinaUser.name);
var appUser = await UserManager.FindAsync(login);
if (appUser != null)
{
await SignInManager.SignInAsync(appUser, isPersistent: false, rememberBrowser: false);
if (string.IsNullOrEmpty(returnUrl))
{
return RedirectToAction("Index", "Home");
}
return RedirectToLocal(returnUrl);
}
else
{
ViewBag.ReturnUrl = returnUrl;
ViewBag.LoginProvider = "sina";
return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = sinaUser.name + "@myweb.com", UserName = sinaUser.screen_name });
}
}
}
catch (Exception ex)
{
return RedirectToAction("Login");
}
}
需要注意的是请求token必须是用Post,而且callBack必须和回调地址一致。
因为新浪微博用户信息没有返回邮箱,所以这里随便加了个@myweb.com
return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = sinaUser.name + "@myweb.com", UserName = sinaUser.screen_name });
否则后面注册的时候验证Email不通过。
这里添加了两个类,用来接收token和用户信息,直接放到AccountViewModels里面。
public class OAuthEntity
{
public string access_token { get; set; }
public string remind_in { get; set; }
public long expires_in { get; set; }
public string uid { get; set; }
}
public class SinaUser
{
/// <summary>
/// 用户UID
/// </summary>
public long id { get; set; }
/// <summary>
/// 用户昵称
/// </summary>
public string screen_name { get; set; }
/// <summary>
/// 友好显示名称
/// </summary>
public string name { get; set; }
/// <summary>
/// 性别,m:男、f:女、n:未知
/// </summary>
public string gender { get; set; }
/// <summary>
/// 用户创建(注册)时间
/// </summary>
public string created_at { get; set; }
/// <summary>
/// 用户头像地址(中图),50×50像素
/// </summary>
public string profile_image_url { get; set; }
/// <summary>
/// 用户头像地址(大图),180×180像素
/// </summary>
public string avatar_large { get; set; }
/// <summary>
/// 用户头像地址(高清),高清头像原图
/// </summary>
public string avatar_hd { get; set; }
}
修改添加一个用户名
public class ExternalLoginConfirmationViewModel
{
[Display(Name = "电子邮件")]
public string Email { get; set; }
/// <summary>
/// 用户名
/// </summary>
[Display(Name = "用户名")]
public string UserName { get; set; }
}
修改ExternalLoginConfirmation
public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl)
{
if (User.Identity.IsAuthenticated)
{
return RedirectToAction("Index", "Manage");
}
if (ModelState.IsValid)
{
// 从外部登录提供程序获取有关用户的信息
UserLoginInfo info = new UserLoginInfo("sina", model.UserName);
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user);
if (result.Succeeded)
{
result = await UserManager.AddLoginAsync(user.Id, info);
if (result.Succeeded)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
return RedirectToLocal(returnUrl);
}
}
AddErrors(result);
}
ViewBag.ReturnUrl = returnUrl;
return View(model);
}
修改下ExternalLoginConfirmation.cshtml页面
@model MyWebApp.Models.ExternalLoginConfirmationViewModel
@{
ViewBag.Title = "注册";
}
<h2>@ViewBag.Title。</h2>
<h3>关联你的 @ViewBag.LoginProvider 帐户。</h3>
@using (Html.BeginForm("ExternalLoginConfirmation", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>关联表单</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<p class="text-info">
你已成功使用 <strong>@ViewBag.LoginProvider</strong> 进行身份验证。
请在下面输入此站点的用户名,然后单击“注册”按钮完成
登录。
</p>
<div class="form-group">
@Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Email, "", new { @class = "text-danger" })
</div>
@Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.UserName, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.UserName, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" class="btn btn-default" value="注册" />
</div>
</div>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
准备完毕了,运行,点击登录

这里就有微博登录了,先不着急用微博登录,先注册新用户,让程序把库建好

成功后会自动登录

看看ASP.Net Identity 通过 EF CodeFirst建的表

接下来试试微博登录,先注销当前账户,再点击登录,这次点击微博登录
会跳转到微博认证

登录后会跳转回来并带有code
http://mywebapp.tunnel.qydev.com/MyWebApp/Account/ExternalLoginCallback?code=dde370ced7025b82572fbe9b29ae5a6d
在后台通过调用token接口获取token后再获取用户信息
如果用户没有注册过,跳转到注册页面

注册后自动登录

此时可以看看表里的变化
AspNetUsers表:

[AspNetUserLogins]表:

再次登录就不用注册了。
Identity的表也可以方便扩展,比如给AspNetUsers添加一个[DisplayName]字段
首先开启EF Codefirst 的自动迁移
Enable-Migrations –EnableAutomaticMigrations

会生成一个目录和一个Configuration文件

然后执行
Add-Migration Init
再执行
Update-Database
也可以加上-v 查看具体的sql
之后在ApplicationUser类里面添加DisplayName

在注册的控制器里添加

更新注册页面

更新RegisterViewModel类

再次运行
update-database -v
之后重新注册

注册成功后看数据库

ASP.NET MVC网站使用新浪微博账号登录的更多相关文章
- 在Windows Azure上创建ASP.NET MVC网站
本篇体验在Windows Azure上创建ASP.NET MVC网站. →登录到Windows Azure管理门户 →点击左下方的"新建" →点击"自定义创建" ...
- 关于linux asp.net MVC网站中 httpHandlers配置无效的处理方法
近期有Jexus用户反映,在Linux ASP.NET MVC网站的Web.config中添加 httpHandlers 配置用于处理自定义类型,但是在运行中并没有产生预期的效果,服务器返回了404( ...
- ASP.NET MVC 网站开发总结(三) ——图片截图上传
本着简洁直接,我们就直奔主题吧,这里需要使用到一个网页在线截图插件imgareaselect(请自行下载). 前台页面: <!DOCTYPE html> <html> < ...
- Asp.net MVC网站的基本结构
Asp.net MVC网站的基本结构:Controller->IBLL(定义业务接口)->BLL->DA(调用Utility)->数据库 ,其中A->B表示A调用B 1. ...
- 总结一下ASP.NET MVC 网站的部署问题
总结一下ASP.NET MVC 网站的部署问题 近日,准备把MVC建了一个新的测试站点部署到IIS上面,结果没想到出现了一系列的问题和错误,准备记录一下. 第一个问题,就是如何将MVC的站点部署到II ...
- IIS部署asp.net mvc网站
iis配置简单的ASP.NET MVC网站编译器:VS 2013本地IIS:IIS 7操作系统:win 7MVC版本:ASP.NET MVC4sql server版本: 2008 r2 打开VS 20 ...
- 阿里云 Windows Server 2012 r2 部署asp.net mvc网站 平坑之旅
做了多年的Web开发工作,网站部署也不在话下,可每次部署却并不是十分顺利,将本次在阿里云服务器上部署asp.net mvc网站遇到的问题记录如下. 平台是阿里云ECS,操作系统是 Windows Se ...
- 用网站(WebSite而不是WebProject)项目构建ASP.NET MVC网站
从ASP.NET MVC第一个版本开始到现在,创建ASP.NET MVC项目的官方方法只有一个,“文件”->“新建”->“项目”,然后选择ASP.NET MVC X Web应用程序. 这种 ...
- 【转载】Asp.Net MVC网站提交富文本HTML标签内容抛出异常
今天开发一个ASP.NET MVC网站时,有个页面使用到了FCKEditor富文本编辑器,通过Post方式提交内容时候抛出异常,仔细分析后得出应该是服务器阻止了带有HTML标签内容的提交操作,ASP. ...
随机推荐
- java se的那些细节
局部变量:方法体内或语句块内,不能有修饰符 成员变量:与类的对象共存,可以有修饰符 类属性:与类共存,可以有修饰符 一.局部变量:必须先赋值,才能使用,如果不赋初值,则会报错,即没有默认的始使值,而基 ...
- vue+大文件分片上传
最近公司在使用vue做工程项目,实现大文件分片上传. 网上找了一天,发现网上很多代码都存在很多问题,最后终于找到了一个符合要求的项目. 工程如下: 对项目的大文件上传功能做出分析,怎么实现大文件分片上 ...
- (01背包 先排序)Proud Merchants (hdu 3466)
http://acm.hdu.edu.cn/showproblem.php?pid=3466 Description Recently, iSea went to an ancient count ...
- limit
在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM table LIMIT [offset ...
- EBS-如何查看非自己提交的请求的结果
http://www.cnblogs.com/quanweiru/p/4692071.html 如何查看非自己提交的请求的结果定位要找的请求SQL举例:SELECT req.request_id, ...
- idea创建第一个maven web项目
一.打开idea,File->New->Project.选择Mavne,勾选Create from archtype,选择org.apache.maven.archtypes:maven- ...
- [BZOJ2738]矩阵乘法(整体二分+二维树状数组)
整体二分+二维树状数组. 好题啊!写了一个来小时. 一看这道题,主席树不会搞,只能用离线的做法了. 整体二分真是个好东西,啥都可以搞,尤其是区间第 \(k\) 大这种东西. 我们二分答案,然后用二维树 ...
- linux只读文件系统
一般方法如下 首先试下重新挂载行不行 mount -o remount,rw /dev/sda3 不行的话用fsck,具体方法如下 1. mount命令查看变成只读文件的位置,比如/dev/sda32 ...
- spring mvc开发过程中的乱码问题
在保证jsp,xml,数据库,编辑器编码一致的情况下. 1,用户输入中文,后台接收到也是中文,但是保存到数据库时乱码, 解决方法: 链接数据库的url="jdbc:mysql://local ...
- Vue过渡动画—Vue学习笔记
要求:要通过Vue使用过渡动画我们要把需要过度的元素放在<transition name='变量名'></transition>中. 原理:通过在特定的时刻增加/移除样式实现. ...