owin Claims-based认证登录实现

        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

            ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);

            if (user == null)
            {
                context.SetError("invalid_grant", "The user name or password is incorrect.");
                return;
            }

            ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
               OAuthDefaults.AuthenticationType);
            ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager,
                CookieAuthenticationDefaults.AuthenticationType);

            AuthenticationProperties properties = CreateProperties(user.UserName);
            AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
            context.Validated(ticket);
            context.Request.Context.Authentication.SignIn(cookiesIdentity);
        }AuthenticationManager 在  Microsoft.Owin.Security命名空间下,而这个接口是定义在Microsoft.OWin.dll中.

OWin ,它是由微软ASP.NET小组成员组织成立的一个开源项目。目标是解耦服务器和应用,这里面的服务器主要是指web 服务器,比如说IIS等,全称是Open Web Interface for .Net。OWin可以说是一套定义,默认它是没有什么具体的实现的

在如今web飞快发展的年代,这种模式已经不能够满足灵活多变的需求。越是轻量级,组件化的东西,越能够快速适应变化,更何况.NET现在要吸引开源社区的注意,只有把这一块打通了,越来越多的强大的开源组件才能够出现在.NET的世界里,比如说写一个开源的ASP.NET web服务器。

我们上面说Owin是一套定义,它通过将服务器与应用程序之间的交互归纳为一个方法签名,称之为“应用程序代理(application delegate)”


AppFunc = Func<IDictionary<string, object>, Task>;

在一个基于Owin的应用程序中的每一个组件都可以通过这样的一个代理来与服务器进行交互。 这们这里的交互其实是与服务器一起来处理http request,比如说ASP.NET管理模型中的那些事件,认证,授权,缓存等等,原先我们是通过自定义的http module,在里面拿到包含了request和response的HttpContext对象,进行处理。而现在我们能拿到的就是一个Dictionary。


可是别小看了这个Dictionary,我们所有的信息比如Application state, request state,server state等等这些信息全部存在这个数据结构中。这个dictionary会在Owin处理request的管道中进行传递,没错有了OWin之后,我们就不再是与ASP.NET 管道打交道了,而是OWin的管道,但是这个管道相对于ASP.NET 管道而言更灵活,更开放。


这个字典在OWin管道的各个组件中传输时,你可以任意的往里面添加或更改数据。 OWin默认为我们定义了以下的数据:

MVC 5默认的start up配置类

VS除了为我们引用OWin相关dll,以及移除FormsAuthenticationModule以外,还为我们在App_Start文件夹里添加了一个Startup.Auth.cs的文件。

public partial class Startup
{
	public void ConfigureAuth(IAppBuilder app)
	{
		// 配置Middleware 組件
		app.UseCookieAuthentication(new CookieAuthenticationOptions
		{
			AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
			LoginPath = new PathString("/Account/Login"),
			CookieSecure = CookieSecureOption.Never,
		});
	}
}

UseCookieAuthentication是一IAppBuilder 的一个扩展方法,定义在Microsoft.Owin.Security.Cookies.dll中。

CookieAuthenticationExtensions.cs

public static IAppBuilder UseCookieAuthentication(this IAppBuilder app,
	CookieAuthenticationOptions options)
{
	if (app == null)
	{
		throw new ArgumentNullException("app");
	}
	app.Use(typeof(CookieAuthenticationMiddleware), app, options);
	app.UseStageMarker(PipelineStage.Authenticate);
	return app;
}


有了这些数据以后,我们就不需要和.NET的那些对象打交道了,比如说ASP.NET MVC中的HttpContextBase, 以及WEB API  中的 HttpRequestMessage和HttpResponseMessage。我们也不需要再考虑system.web 这个dll里的东西,我们只需要通过OWin就可以拿到我们想要的信息,做我们想做的事了。而OWin,它本身和web服务器或者IIS没有任何关系。

 
时间: 2024-10-17 05:21:02

owin Claims-based认证登录实现的相关文章

Claims Based Authentication and Token Based Authentication

基于声明的认证方式,主要用于第三方认证. A claim is a statement that one subject makes about itself or another subject. The statement can be about a name, identity, key, group, privilege, or capability, for example. Claims are issued by a provider, and they are given on

python--用户认证登录实现

# _*_ coding: cp936 _*_ //支持中文格式 import sys import getpass #admin configuration username='cheeron' password='1234' counter = 0 #认证登录 while True: if counter <3: name = raw_input('Please input your name: ').strip() if len(name) == 0: print 'empty name,

关于AD域在通过LDAP认证登录时密码修改后还可使用旧密码正常登录问题解决方法

最近一直在做一个LDAP的管理认证登录平台,但是发现在Active Directory中修改用户账号密码后,LDAP认证还可以正常通过认证,并登录系统,这是什么原因了? 在查看相关资料后发现,系Active Directory原因造成:那么应该如何解决这个问题了,可以通过修改旧密码的生命周期时间可以解决此问题: 具体原因: ?域用户成功更改密码使用 NTLM 后,旧密码仍然可用于网络访问用户可定义的时间段.此行为允许帐户,如服务帐户,登录到多台计算机来访问网络,而密码更改会传播. ?密码的扩展寿

ssh 认证登录

SSH无密码登录 说明:每次登录需要输入Linux服务器的密码特麻烦而且还遇到暴力破解的安全性问题...因此做了一个简单的防护或便捷. 步骤如下 ssh-keygen -t rsa 通过ftp工具将/root/.ssh/下将id_rsa.pub 拷贝出来.(如我用的是xshell) cp -p id_rsa.pub authorized_keys 修改ssh 配置文件 vim /etc/ssh/sshd_config 47 RSAAuthentication yes 48 PubkeyAuthe

Angularjs 通过asp.net web api认证登录

Angularjs 通过asp.net web api认证登录 Angularjs利用asp.net mvc提供的asp.net identity,membership实现居于数据库的用户名/密码的认证登录 环境 Vs.net 2013 Asp.net mvc + web api Individual user accounts Angularjs Underscore 新建一个asp.net mvc+ web api project 注册一个test用户用于测试 新建一个用于登录验证用户名密码

C#开发中Windows域认证登录2016(扩展吉日嘎拉GPM系统V4.2)

2013年搞公司的OA时,为了统一用户登录,将Windows AD的用户和OA的账号对接,OA用户名的规则就是使用Windows AD的用户名,格式举例:Troy.Cui,原理就是先进行域服务器的认证,认证完毕使用自定义的函数根据用户名读取出OA的用户信息,然后读取出用户名和密码信息,最后使用获取到的用户名和密码进行正常的登录.当时的文章:<C#开发中Windows域认证登录2(扩展吉日嘎拉GPM系统)>,本周打算OA中开发在线培训的功能,也想借此机会升级一下底层的应用DotNet.Busin

基于Thinkphp3.2的qq第三方oauth认证登录扩展类

基于Thinkphp3.2的qq第三方oauth认证登录扩展类,由于腾讯oauth sdk写的太多,不能与thinkphp和好的结合,最终想法讲腾讯oauth sdk写成tp的扩展类先看代码,将代码保存在/library/org/util/Qqconnect.class.php文件中在__construct方法中你可以直接写你的app_id.app_key和回调地址也可以根据自己的喜好,改一下代码传参或者写到配置文件.调用方法:1. 在qq的登录按钮的方法中调用getAuthCode方法例如:$

Linux SecureCRT ssh key认证登录

通过SecureCRT创建key登录认证 一.生成公钥/私钥 使用SecureCRT的工具->创建公钥,加密算法选择RSA,因为sshd配置文件中选择了RSA算法. 通行短语可以不输入.但要求输入,登陆的时候会要求你输入通行短语. 并修改Comment 相关信息,采用个人账户名称@服务器信息方式 填写密钥长度,默认是1024 这里选择生成的密钥使用 OpenSSH Key 格式.如果选择默认的格式,上传到服务器的时候需要执行格式转换的工作,需要通过命令行来连接的也需要通过securecrt来转换

思科交换机通过radius认证登录

思科交换机 2960,优先radius 认证,然后本地local认证 aaa new-model aaa group server radius radius_group aaa authentication login default local aaa authentication login windows group radius_group local aaa session-id common radius-server host 10.10.10.1 auth-port 1812

使用XShell工具密钥认证登录Linux系统

如果你是一名Linux运维,那么Linux服务器的系统安全问题,可能是你要考虑的,而系统登录方式有两种,密码和密钥.哪一种更加安全呢? 无疑是后者! 这里我为大家分享用Xshell利器使用密钥的方式登录Linux服务器! 关于Xshell,它是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议.与之类似的工具还有PUTTY.SecureCRT等. 1.点击Xshell菜单栏的工具,选择新建用户密钥生成向导,进行密钥对生成操作