简化模式又称为隐式授权码模式,它是授权码模式的一个简化版本。具体来说,在简化模式中,授权服务器不返回授权码,而直接返回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版权协议,转载请附上原文出处链接和本声明。