MVC5应用程序-实现OAuth授权代码流

MVC5应用程序-实现OAuth授权代码流,oauth,oauth-2.0,asp.net-mvc-5,owin,katana,Oauth,Oauth 2.0,Asp.net Mvc 5,Owin,Katana,基于本教程,我创建了一个授权服务器、一个资源服务器和一个MVC客户端。 MVC客户端有一个从资源服务器获取数据的控制器。资源服务器需要身份验证。MVC客户端从授权服务器获取授权代码,并将用户重定向到授权服务器进行身份验证。最后,MVC客户端将授权代码交换为访问令牌以访问资源服务器。这是OAuth 2协议描述的授权代码流。这个很好用 现在,我需要使MVC客户机的控制器本身需要身份验证。我找不到这方面的教程 我补充说 app.UseOAuthBearerAuthentication(new OAut

基于本教程,我创建了一个授权服务器、一个资源服务器和一个MVC客户端。 MVC客户端有一个从资源服务器获取数据的控制器。资源服务器需要身份验证。MVC客户端从授权服务器获取授权代码,并将用户重定向到授权服务器进行身份验证。最后,MVC客户端将授权代码交换为访问令牌以访问资源服务器。这是OAuth 2协议描述的授权代码流。这个很好用

现在,我需要使MVC客户机的控制器本身需要身份验证。我找不到这方面的教程

我补充说

app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
到我的Startup.Auth.cs。 我假设,我需要设置重定向到授权服务器的选项。我还可以在选项上设置提供程序:

app.UseOAuthBearerAuthentication(new Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationOptions()
{
    Provider = new OAuthBearerAuthenticationProvider()
});
但我也被困在实现提供者的事件上。
有人能给我指引正确的方向吗?或者有什么教程可以帮助我吗?

我最终根据Brock Allen的这两篇文章提出了一个解决方案:

其基本思想是注册两个认证中间件。主动Cookie身份验证和被动OAuthBear身份验证。在Startup.Auth.cs中,它们是这样添加的:

app.UseCookieAuthentication(新的CookieAuthenticationOptions()
{
AuthenticationType=DefaultAuthenticationTypes.ApplicationOkie,
LoginPath=新路径字符串(“/ExternalLogin/Login”),
});
app.useAuthBeareAuthentication(新的OAuthBeareAuthenticationOptions()
{
AuthenticationType=DefaultAuthenticationTypes.ExternalBearer,
AuthenticationMode=Microsoft.Owin.Security.AuthenticationMode.Passive,
});
您还可以添加一个ExternalLogin控制器。其登录方法必须将用户重定向到授权服务器的登录页面以获取授权代码。您必须提供一个回调函数来处理授权代码

公共异步任务登录(字符串返回URL)
{
if(string.IsNullOrEmpty(returnUrl)&&Request.urlReferer!=null)
returnUrl=Server.UrlEncode(Request.urlreferer.PathAndQuery);
if(Url.IsLocalUrl(returnUrl)&&!string.IsNullOrEmpty(returnUrl))
_returnUrl=returnUrl;
//回调函数
_重定向Url=Url.Action(“AuthorizationCodeCallback”,“ExternalLogin”,null,Request.Url.Scheme);
args=null;
args=新字典
{
{“客户id”,“0123456789”}
,{“响应类型”,“代码”}
,{“范围”,“读取”}
,{“重定向uri”,{U重定向URL}
//可选:状态
};
var content=new FormUrlEncodedContent(authorizeArgs);
var contentAsString=await content.ReadAsStringAsync();
返回重定向(“http://localhost:64426/oauth/authorize?“+内容字符串);
}
在回调函数中,您交换访问令牌(加上刷新令牌)的授权码,挑战被动OAuthBearner身份验证中间件,并使用访问令牌作为Cookie进行登录

公共异步任务授权CodeCallback()
{
//从授权服务器接收到授权代码
字符串[]代码=Request.Params.GetValues(“代码”);
var授权代码=”;
如果(代码长度>0)
授权代码=代码[0];
//在授权服务器上为访问和刷新令牌交换授权代码
字典post=null;
新字典
{
{“客户id”,“0123456789”}
,{“客户机密”,“客户机密”}
,{“授权类型”,“授权代码”}
,{“代码”,授权代码}
,{“重定向uri”,{U重定向URL}
};
var client=新的HttpClient();
var postContent=新FormUrlEncodedContent(post);
var response=wait client.PostAsync(“http://localhost:64426/token“,后内容);
var content=await response.content.ReadAsStringAsync();
//从授权服务器接收令牌
var json=JObject.Parse(内容);
_accessToken=json[“访问令牌”].ToString();
_authorizationScheme=json[“令牌类型”].ToString();
_expiresIn=json[“expires_in”].ToString();
if(json[“刷新令牌”]!=null)
_refreshToken=json[“refresh_token”].ToString();
//使用令牌登录、注销并为登录创建新身份
Request.Headers.Add(“授权”,“授权方案+”+\u访问令牌);
var ctx=Request.GetOwinContext();
var authenticateResult=wait ctx.Authentication.authenticateSync(DefaultAuthenticationTypes.ExternalBearer);
ctx.Authentication.SignOut(DefaultAuthenticationTypes.ExternalBearer);
var applicationcokieeidentity=new ClaimsIdentity(authenticateResult.Identity.Claims,DefaultAuthenticationTypes.applicationcokie);
ctx.Authentication.SignIn(applicationCookieIdentity);
var ctxUser=ctx.Authentication.User;
var user=Request.RequestContext.HttpContext.user;
//重定向回需要身份验证的视图
字符串decodedUrl=“”;
如果(!string.IsNullOrEmpty(_returnUrl))
decodedUrl=Server.UrlDecode(_returnUrl);
if(Url.IsLocalUrl(decodedUrl))
返回重定向(decodedull);
其他的
返回重定向到操作(“索引”、“主页”);
}
我希望这对在MVC 5应用程序中实现OAuth授权代码流的人有用。

我使用了官方示例,我认为这是MVC应用程序的正确身份验证流


对于授权,我使用了它,特别是关于无限循环的部分,其中指定了角色
[Authorize(roles=“Foo,Bar”)]
,并且用户经过身份验证,但不拥有这些角色。

感谢分享。看到有这么多使用naive
UseTwitterAuthentication
的例子,令人非常沮丧<