• .Net WebApi 实现OAuth2.0认证


    现在多数公众平台提供的api都使用OAuth2.0认证模式,最近在搞Android方面的开发,身份认证和权限控制的各方面比较来说,使用OAuth认证的还是比较靠谱,OAuth2.0的协议可以参考https://tools.ietf.org/html/rfc6749。

    微信Katana项目实现了OWIN的一系列接口,其中实现OAuth认证主要用到这三个类库Microsoft.Owin,Microsoft.Owin.Security,Microsoft.Owin.Security.OAuth,其中官方实现了Bearer Token的认证方式,这个是twitter使用的认证模式,可以参考 RFC 6750: The OAuth 2.0 Authorization Framework: Bearer Token Usage

    基于Owin搭建中间件的方式,Bearer Token的实现包括三个类,OAuthBearerAuthenticationHandler、OAuthBearerAuthenticationMiddleware、OAuthBearerAuthenticationOptions,有兴趣的朋友可以自己扩展实现其他的认证方式,如微信api那种类型的,把token放在查询参数中或者Post的表单里的。

    配置身份认证的详细信息,可以参考官方文档 http://go.microsoft.com/fwlink/?LinkId=301864

    (1) 配置应用程序

    在Startup.cs,配置使用BearerToken认证模式,TokenEndpointPath是获取Token的路径,Provider配置IOAuthAuthorizationServerProvider接口的实现类处理权限认证过程的各种事件(包括token请求、认证请求、验证认证等)。

    public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }
                OAuthOptions = new OAuthAuthorizationServerOptions
                {
                    TokenEndpointPath = new PathString("/Token"),
                    Provider = new ApplicationOAuthProvider(PublicClientId),
                    AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
                    AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
                    //在生产模式下设 AllowInsecureHttp = false
                    AllowInsecureHttp = true                
                };
    
                // 使应用程序可以使用不记名令牌来验证用户身份
                app.UseOAuthBearerTokens(OAuthOptions);

    (2)配置Provide,建一个类继承 OAuthAuthorizationServerProvider,这个类已经实现了大部分功能,我们现在需要做的是用户认证部分,通过重载GrantResourceOwnerCredentials获取用户名和密码进行认证。

        public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
        {
            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", "用户名或密码不正确。");
                    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);
            }
        }

     这样整个OAuth2.0的认证架构就搭起来了,后面再介绍怎么使用网页和Android获取token及访问数据。

    梦秋 2016-07-19

  • 相关阅读:
    接口和抽象类的异同点
    实体对象间传值克隆
    什么是反射&反射的8个类的用法
    ERP中反射的两个实例
    基础02 Java 跨平台原理
    基础01 dos命令
    lists删除
    多字段 java对象排序
    Java对象排序
    MySQL表中数据的迁移
  • 原文地址:https://www.cnblogs.com/freetalent/p/5683599.html
Copyright © 2020-2023  润新知