DotNetOpenAuth搭建验证服务器及制作Windows签名

DotNetOpenAuth搭建验证服务器

本次搭建环境:

.net4.5.1 ,DotNetOpenAuth v5.0.0-alpha3,MVC5

一、环境搭建

1、新建一个空的VS解决方案


2、添加验证服务器项目,项目选择MVC,不要自带的身份验证



3、使用Nuget添加DotNetOpenAuth v5.0.0-alpha3


输入DotNetOpenAuth 安装DotNetOpenAuth v5.0.0-alpha3


添加完成后


二、编写DotNetOpenAuth 验证服务器关键代码,实现功能

1、添加AuthorizationServerConfiguration.cs

这里的配置是为了添加方便管理,其实可以不用这个类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Web;
namespace IdefavAuthorizationServer.Code
{
    /// <summary>
    /// 验证服务器配置
    /// </summary>
    public class AuthorizationServerConfiguration
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        public AuthorizationServerConfiguration()
        {
            TokenLifetime = TimeSpan.FromMinutes(5);
        }
        /// <summary>
        /// 签名证书
        /// </summary>
        public X509Certificate2 SigningCertificate { get; set; }
        /// <summary>
        /// 加密证书
        /// </summary>
        public X509Certificate2 EncryptionCertificate { get; set; }
        /// <summary>
        /// Token有效时间
        /// </summary>
        public TimeSpan TokenLifetime { get; set; }
    }
}

2、实现IClientDescription接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using DotNetOpenAuth.Messaging;
using DotNetOpenAuth.OAuth2;
namespace IdefavAuthorizationServer.Code
{
    public class Client : IClientDescription
    {
        /// <summary>
        /// 客户端名称client_id
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 客户端类型
        /// </summary>
        public int ClientType { get; set; }
        /// <summary>
        /// 回调URL
        /// </summary>
        public string Callback { get; set; }
        public string ClientSecret { get; set; }
        Uri IClientDescription.DefaultCallback
        {
            get { return string.IsNullOrEmpty(this.Callback) ? null : new Uri(this.Callback); }
        }
        ClientType IClientDescription.ClientType
        {
            get { return (ClientType)this.ClientType; }
        }
        bool IClientDescription.HasNonEmptySecret
        {
            get { return !string.IsNullOrEmpty(this.ClientSecret); }
        }
        bool IClientDescription.IsCallbackAllowed(Uri callback)
        {
            if (string.IsNullOrEmpty(this.Callback))
            {
                // No callback rules have been set up for this client.
                return true;
            }
            // In this sample, it's enough of a callback URL match if the scheme and host match.
            // In a production app, it is advisable to require a match on the path as well.
            Uri acceptableCallbackPattern = new Uri(this.Callback);
            if (string.Equals(acceptableCallbackPattern.GetLeftPart(UriPartial.Authority), callback.GetLeftPart(UriPartial.Authority), StringComparison.Ordinal))
            {
                return true;
            }
            return false;
        }
        bool IClientDescription.IsValidClientSecret(string secret)
        {
            return MessagingUtilities.EqualsConstantTime(secret, this.ClientSecret);
        }
    }
}

3、实现IAuthorizationServerHost接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Web;
using DotNetOpenAuth.Messaging.Bindings;
using DotNetOpenAuth.OAuth2;
using DotNetOpenAuth.OAuth2.ChannelElements;
using DotNetOpenAuth.OAuth2.Messages;
namespace IdefavAuthorizationServer.Code
{
    public class IdefavAuthorizationServerHost : IAuthorizationServerHost
    {
        /// <summary>
        /// 配置
        /// </summary>
        private readonly AuthorizationServerConfiguration _configuration;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="config"></param>
        public IdefavAuthorizationServerHost(AuthorizationServerConfiguration config)
        {
            if (config != null)
                _configuration = config;
        }
        /// <summary>
        /// Token创建
        /// </summary>
        /// <param name="accessTokenRequestMessage"></param>
        /// <returns></returns>
        public AccessTokenResult CreateAccessToken(IAccessTokenRequest accessTokenRequestMessage)
        {
            var accessToken = new AuthorizationServerAccessToken();
            accessToken.Lifetime = _configuration.TokenLifetime;//设置Token的有效时间
            // 设置加密公钥
            accessToken.ResourceServerEncryptionKey =
                (RSACryptoServiceProvider)_configuration.EncryptionCertificate.PublicKey.Key;
            // 设置签名私钥
            accessToken.AccessTokenSigningKey = (RSACryptoServiceProvider)_configuration.SigningCertificate.PrivateKey;
            var result = new AccessTokenResult(accessToken);
            return result;
        }
        public IClientDescription GetClient(string clientIdentifier)
        {
            // 这里需要去验证客户端发送过来的client_id
            if (string.Equals(clientIdentifier, "idefav", StringComparison.CurrentCulture))// 这里为了简明起见没有使用数据库
            {
                var client=new Client
                {
                    Name = "idefav",
                    ClientSecret = "1",
                    ClientType = 1
                };
                return client;
            }
            throw new ArgumentOutOfRangeException("clientIdentifier");
        }
        public bool IsAuthorizationValid(IAuthorizationDescription authorization)
        {
            return true;
        }
        public AutomatedUserAuthorizationCheckResponse CheckAuthorizeResourceOwnerCredentialGrant(string userName, string password,
            IAccessTokenRequest accessRequest)
        {
            throw new NotImplementedException();
        }
        public AutomatedAuthorizationCheckResponse CheckAuthorizeClientCredentialsGrant(IAccessTokenRequest accessRequest)
        {
            AutomatedUserAuthorizationCheckResponse response = new AutomatedUserAuthorizationCheckResponse(accessRequest, true, "test");
            return response;
        }
        public ICryptoKeyStore CryptoKeyStore { get; }
        public INonceStore NonceStore { get; }
       
    }
}

4、实现OAuthController

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using DotNetOpenAuth.Messaging;
using DotNetOpenAuth.OAuth2;
using IdefavAuthorizationServer.Code;
namespace IdefavAuthorizationServer.Controllers
{
    public class OAuthController : Controller
    {
        private readonly AuthorizationServer authorizationServer =
           new AuthorizationServer(new IdefavAuthorizationServerHost(Common.Configuration));
        public async Task<ActionResult> Token()
        {
            var response = await authorizationServer.HandleTokenRequestAsync(Request);
            return response.AsActionResult();
        }
    }
}

5、初始化AuthorizationServerConfiguration

这里采用Windows签名证书


放到项目中


制作证书事注意:要加上-a sha1 -sky exchange

到此,基本代码就写完了,现在说说要注意的地方,OAuth2默认设置的请求是要求SSL的也就是必须是https//localhost:1111/OAuth/Token,然后我们现在不需要使用SSL加密请求,更改一下WebConfig文件


在WebConfig里面设置成如图中那样,就可以不用https访问了

6、我们F5运行项目

使用Post工具发送Post请求访问 http://localhost:53022/OAuth/token

Body参数:

1 client_id:idefav

2 client_secret:1

3 grant_type:client_credentials

请求结果:


这样我们就拿到了access_token,通过这个access_token我们就可以访问资源服务器了

更新:

OAuthController代码添加内容类型

using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using System.Web.Script.Services;
using DotNetOpenAuth.Messaging;
using DotNetOpenAuth.OAuth2;
using IdefavAuthorizationServer.Code;
namespace IdefavAuthorizationServer.Controllers
{
    public class OAuthController : Controller
    {
        private readonly AuthorizationServer authorizationServer =
           new AuthorizationServer(new IdefavAuthorizationServerHost(Common.Configuration));
        
        public async Task<ActionResult> Token()
        {
            var response = await authorizationServer.HandleTokenRequestAsync(Request);
            Response.ContentType = response.Content.Headers.ContentType.ToString();
            return response.AsActionResult();
        }
    }
}

DotNetOpenAuth制作Windows签名

一、工具

makecert.exe,cert2spc.exe,pvk2pfx.exe

百度网盘地址:

链接:http://pan.baidu.com/s/1ntOq3Cd 密码:j2rn

二、制作

1、创建一个自己签署的证书和一个私钥文件用到makecert工具

命令:

makecert -a sha1 -sky exchange -n "CN=发行者名称" -b 10/18/2015 -e 01/01/2018 -sv
你的名称.pvk 你的名称.cer

打开命令行,并定位到makecert.exe所在目录


输入命令

例如: makecert -a sha1 -sky exchange -n "CN=idefav" -b 10/18/2015 -e 01/01/2018
-sv test.pvk test.cer

回车之后,弹出私钥加密密码


输入密码后,目录里面就生成了cer和pvk文件


2、利用证书.cer创建发行者证书.spc,用到cert2spc工具

命令:

cert2spc 你的名称.cer 你的名称.spc

输入命令生成spc文件


3、从.pvk和.spc格式转换成.pfx格式,用到pvk2pfx工具

命令:

pvk2pfx -pvk 你的名称.pvk -pi pvk密码 -spc 你的名称.spc

注意:pvk密码就是上次弹出输入的密码

输入命令回车,弹出证书导出向导






这样cer和pfx就制作完成了,下面我们把这两个文件放到上篇制作的项目中去


改一下Global.axax中的初始化代码


运行项目使用post工具访问


成功获取access_token

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索密码
, 服务器
, string
, new
, this
using
dotnetopenauth、dotnetopenauth实战、dotnetopenauth.core、dotnetopenauth sso、dotnetopenauth 官网,以便于您获取更多的相关知识。

时间: 2024-10-27 00:21:53

DotNetOpenAuth搭建验证服务器及制作Windows签名的相关文章

使用Serv-U搭建FTP服务器以及bestsync自动同步设置

  像一般下载站,软件下载都会有几台服务器作为镜像下载,那么怎么在服务器上面建立同步呢,话说几台服务器手动同步是很麻烦的.那么bestsync这个软件可以帮到您,他是可以建立自动同步的.需要在windows 2003中搭建一台FTP服务器,用于文件的上传与下载;同时将FTP服务器目录中的文件同步到多个服务器中,实现同步更新,同时文件需要控制用户访问对应的文件夹权限. 需要用到的软件有:bestsync(同步传输软件) Serv-U(搭建FTP) 步骤 使用Serv-U搭建FTP服务器 windo

Windows搭建ngrok服务器、Linux搭建ngrok服务器、支持用户管理

                           Windows搭建ngrok服务器.Linux搭建ngrok服务器.支持用户管理 阿里云双11领代金券啦 https://m.aliyun.com/act/activity2017h5?userCode=vc31fdqr&utm_source=vc31fdqr           微信公众号.支付宝支付等开发要求有公网(外网)服务器.每次调试时,上传代码到服务器很不方便.ngrok很好的解决了这一问题.网上的文章大多是讲实通过阿里怎么在Lin

java程序员菜鸟进阶(九)windows下搭建SVN服务器及配置myeclipse SVN客户端

  java程序员菜鸟进阶(九)windows下搭建SVN服务器及配置myeclipse SVN客户端 分类: 学习专区 java Web    1.下载SVN最新版本安装文件,官网下载地址是:http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100,选择最新发布的SVN安装文件进行下载.最新版本是Setup-Subversion-1.6.5.msi,大小7.4MB,安装SVN至我的电脑.最好使用中文路径,而且

在Windows系统下搭建SVN服务器

通常的SVN服务器是搭建在Linux等系统下,例如用Apache+SVN配置,Linux下的SVN性能会非常好,但配置有些繁琐,如果SVN服务器只有自己使用,那么可以直接把SVN服务器搭建在个人Windows环境下使用. 前文所述SVN客户端使用的时候,用的SVN服务器通常为外部,例如Google Code的服务器,不过,做为一个程序开发人员,就算自己一个人写程序,也应该有一个SVN版本控制系统,以便对开发代码进行有效的管理.这里我就介绍一个在Windows环境下简单快速搭建SVN服务器的方法.

在Windows 2003中搭建视频服务器

随着Internet和Intranet应用日益丰富,视频点播也逐渐应用于宽带网和局域网.人们已不再满足于浏览文字和图片,越来越多的人更喜欢在网上看电影.听音乐.而视频点播和音频点播功能的实现,则必须依靠流媒体服务技术.就目前来看,最流行的流媒体点播服务器只有两种,即Windows Media服务和Real Server.下面我们在这里主要讨论在Windows 2003 Server环境下如何搭建视频点播服务器.我们大家知道,Windows Media服务采用流媒体的方式来传输数据.通常格式的文件

windows下svn+apache搭建svn服务器

  windows下svn+apache搭建svn服务器 使用软件: apache_2.0.55-win32-x86-no_ssl.msi Setup-Subversion-1.5.3.msi TortoiseSVN-1.5.10.16879-win32-svn-1.5.7.msi 一.安装apache服务器 安装apache_2.0.55-win32-x86-no_ssl.msi,开始是需要设置一下网址啊邮箱啊,随便设置(真实不存在都没问题),然后就是基本无脑的下一步下一步 安装完测试时候12

服务器-如何在Windows Server2012系统中搭建VPN服务

问题描述 如何在Windows Server2012系统中搭建VPN服务 想在Windows Server2012系统中搭建一个VPN服务,,,然后用其他电脑连接 通过网上按别人的方法自己操作了一遍,,但是连接不上VPN服务器(我的是XP系统)一直报721错误 不知道是否还有哪些服务没有关闭,,还是因为我(客户端)连接的宽带之上的路由器没有开启相关功能(但那是移动说了算啊) 解决方案 怎样才能凑够10个字符呢 解决方案二: 如果你的服务器配置没问题,那么可能是你的客户端的问题,特别是一些山寨盗版

windows下搭建sftp服务器

问题描述 windows下搭建sftp服务器 Windows下搭建sftp服务器,服务器实现不同用户读取不同目录,即对用户设定权限,用过freessh,但不懂如何对用户设定权限. 解决方案 linux 下 sftp 默认都会安装的, Windows 就没有了.网上搜的资料发现比较好用的是 freesshd,免费版中最好用的. 1,下载:http://www.freesshd.com/?ctt=download , 只下载??freeSSHd.exe?就可以了 2,安装:一路默认就可以了 3,设置

Windows Server 2003下搭建视频点播服务器

随着网络应用的日益丰富,越来越多的网友都喜欢在网上看电影.听音乐.大家有没能想过自己架设一台视频服务器,把自己收集的好看.好听的影音http://www.aliyun.com/zixun/aggregation/18450.html">文件共享给大家呢?众所周知,视频点播和音频点播功能的实现,必须依靠流媒体服务技术,目前最流行的流媒体点播服务器有两种,分别是Windows Media和Real Server.今天我就给大家介绍一下在Windows 2003 server 环境下如何搭建视频