C# Claims-based(基于声明)的认证

本文是通过验证与网上资料整合的,请读者注意。

 

目录:

1. 什么是Claims-based认证

2.进一步理解Claims-based认证

3.Claims-based的简单demo

 

1. 什么是Claims-based认证

首先,这种机制并非微软特有的,Claims-based认证和授权在国外被广泛使用,包括微软的ADFS,Google,Facebook等。

Claims-based认证的主要特点:

  • 将认证与授权拆分成独立的服务
  • 服务调用者(一般是网站),不需要关注你如何去认证,你用Windows认证也好,用令牌手机短信也好,与我无关。
  • 如果用户成功登录的话,认证服务(假如是QQ) 会返回给我们一个令牌。
  • 令牌当中包含了服务调用者所需要的信息,用户名,以及角色信息等等。

     总的来说就是,我再也不用管你怎么登录,怎么样去拿你有哪些角色了,我只需要把你跳到那个登录站点上,然后它返回给我令牌信息,我从令牌上获取需要的信息来确定你是谁,你拥有什么角色就可以了。

 

2.进一步理解Claims-based认证

 为了让大家进一步理解Claims-based认证,我们从一个普通的登录场景开始说起,拿QQ集成登录来举例。

  1. 用户跑到我们的网站来访问一个需要登录的页面
  2. 我们的网站检测到用户没有登录,返回一个跳转到QQ登录页的响应(302 指向QQ登录页面的地址并加上一个返回的链接页面,通常是returnUrl=)
  3. 用户被跳转到指定QQ的登录页面
  4. 用户在QQ登录页面上输入用户名和密码,QQ会到自己的数据库中查询,一旦登录成功,会返回一个跳转到我们站点的响应(302指向我们的网站页面)
  5. 用户被跳转到我们网站的一个检测登录的页面,我们可以拿到用户的身份信息,建立ClaimsPrinpical和ClaimsIdentity对象,生成cookie等。
  6. 我们再把用户带到指定的页面,也就是returnUrl,那是用户登录前最后一次访问的页面

               

 

3.Claims-based的简单demo

1)首先我们创建一个自己的项目,我们这里创建一个MVC项目,名字叫TestIdentity

2)然后我们新建一个DefaultController,代码如下:

    [Authorize]是添加整个Controller的权限验证

    [Authorize(Roles = "Users")]是添加方法的权限验证

using System.Web.Mvc;

namespace TestIdentity.Controllers
{
    [Authorize]
    public class DefaultController : Controller
    {

        [Authorize(Roles = "Users")]
        public ActionResult D1()
        {
            return View();
        }

        [Authorize(Roles = "Managers")]
        public ActionResult D2()
        {
            return View();
        }

        public ActionResult D3()
        {
            return View();
        }
    }
}

 

我们启动项目,可以看到:401错误,没有权限(访问所有的方法都没有权限)

image

 

3)下面,我们添加Application_AuthenticateRequest方法到Global.asax。

Application_AuthenticateRequest是每次有权限请求时,都会调用。(程序启动时也会调用)

        protected void Application_AuthenticateRequest()
        {
            var clamis = new List<Claim>();
            clamis.Add(new Claim(ClaimTypes.Name, "Alun"));
            clamis.Add(new Claim(ClaimTypes.Role, "Users"));
            var identity = new ClaimsIdentity(clamis, "MyLogin");

            ClaimsPrincipal principal = new ClaimsPrincipal(identity);
            //把用户权限添加到User
            HttpContext.Current.User = principal;
        }

 

当我们访问:

http://localhost:50478/Default/D1    可以访问

http://localhost:50478/Default/D2    没有权限,因为权限是Managers

http://localhost:50478/Default/D3    可以访问

 

简单的介绍到此结束了

 

可以关注本人的公众号,多年经验的原创文章共享给大家。

posted on 2017-04-28 17:50 alun-chen 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/alunchen/p/6782701.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值