详解.NET实现OAuth2.0四种模式(5)简化模式

简化模式又称为隐式授权码模式,它是授权码模式的一个简化版本。具体来说,在简化模式中,授权服务器不返回授权码,而直接返回AccessToken。这种模式一般用在无法安全保存AppSecret等信息的应用中,如HTML/JS应用(所有代码都在明文中)。授权码原先设计的目的是验证应用是合法的,但既然应用没办法证明自己,就没有必要多一步请求了。

我们直接来看简化模式的实现。由于不再需要授权码,授权码提供类可以略掉,而OAuth服务器的配置项少了一项。完整的Startup类如下所示:

[assembly: OwinStartup(typeof(ImplicitMode.Startup))]//让整个网站的入口为Startup这个类
namespace ImplicitMode
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            //配置OAuth
            ConfigureOAuth(app);

            //配置网站路由等信息
            HttpConfiguration config = new HttpConfiguration();
            Register(config);

            //允许跨域访问
            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

            app.UseWebApi(config);
        }

        private void ConfigureOAuth(IAppBuilder app)
        {
            OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
            {
                AllowInsecureHttp = true,//允许http而非https访问
                AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,//激活授权码模式
                TokenEndpointPath = new PathString("/token"),//访问host/token获取AccessToken
                AuthorizeEndpointPath = new PathString("/auth"),//访问host/auth获取授权码
                AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),//AccessToken在30分钟后过期
                Provider = new AuthorizationServerProvider(),//AccessToken的提供类              
            };

            app.UseOAuthAuthorizationServer(OAuthServerOptions);
            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

        }

        private static void Register(HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
            jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        }
    }
}

在整个认证过程中,AuthorizationServerProvider类有三个函数会被调用:

(1)ValidateClientRedirectUri,验证重定向URI是否合法。

(2)ValidateAuthorizeRequest,验证请求信息是否合法。

(3)AuthorizeEndpoint,完成认证,跳转到重定向URI。

具体实现代码如下:

public override async Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)
{
    context.Validated(context.RedirectUri);
}

public override async Task ValidateAuthorizeRequest(OAuthValidateAuthorizeRequestContext context)
{
    if (context.AuthorizeRequest.ClientId.StartsWith("AAA"))
    {
        context.Validated();
    }
    else
    {
        context.Rejected();
    }
}

public override async Task AuthorizeEndpoint(OAuthAuthorizeEndpointContext context)
{
    var identity = new ClaimsIdentity("Bearer");
    context.OwinContext.Authentication.SignIn(identity);
    context.RequestCompleted();
}

简化模式不一定使用POST方法,也可以使用GET方法。所以可以直接在浏览器中进行测试。简化模式需要访问host/auth地址,参数要求如下:

(1)response_type,为token。

(2)client_id,客户端ID。

(3)redirect_uri,重定向URI。

(4)scope,申请的权限范围,可选。

(5)state,客户端状态,可选。

测试请求:

响应:

可以看到,响应的地址中带上了AccessToken。


版权声明:本文为lweiyue原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。