yavsc/Yavsc/Controllers/Accounting/OAuthController.cs

153 lines
5.3 KiB
C#

using System.Collections.Generic;
8 years ago
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNet.Authorization;
using Microsoft.AspNet.DataProtection.KeyManagement;
8 years ago
using Microsoft.AspNet.Http.Authentication;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Mvc;
8 years ago
using Microsoft.AspNet.WebUtilities;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.OptionsModel;
8 years ago
using Microsoft.Extensions.Primitives;
8 years ago
using OAuth.AspNet.AuthServer;
using Yavsc.Models;
8 years ago
using Yavsc.Models.Auth;
namespace Yavsc.Controllers
{
[AllowAnonymous]
public class OAuthController : Controller
{
ApplicationDbContext _context;
UserManager<ApplicationUser> _userManager;
8 years ago
SiteSettings _siteSettings;
ILogger _logger;
private readonly SignInManager<ApplicationUser> _signInManager;
public OAuthController(ApplicationDbContext context, SignInManager<ApplicationUser> signInManager, IKeyManager keyManager,
UserManager<ApplicationUser> userManager,
IOptions<SiteSettings> siteSettings,
ILoggerFactory loggerFactory
)
{
_siteSettings = siteSettings.Value;
_context = context;
_signInManager = signInManager;
_userManager = userManager;
_logger = loggerFactory.CreateLogger<OAuthController>();
}
7 years ago
[HttpGet("~/api/getclaims"), Produces("application/json")]
public IActionResult GetClaims()
{
var identity = User.Identity as ClaimsIdentity;
var claims = from c in identity.Claims
select new
{
subject = c.Subject.Name,
type = c.Type,
value = c.Value
};
return Ok(claims);
}
8 years ago
[HttpGet(Constants.AuthorizePath),HttpPost(Constants.AuthorizePath)]
8 years ago
public async Task<ActionResult> Authorize()
{
8 years ago
if (Response.StatusCode != 200)
{
return View("AuthorizeError");
}
AuthenticationManager authentication = Request.HttpContext.Authentication;
8 years ago
var appAuthSheme = Startup.IdentityAppOptions.Cookies.ApplicationCookieAuthenticationScheme;
8 years ago
8 years ago
ClaimsPrincipal principal = await authentication.AuthenticateAsync(appAuthSheme);
8 years ago
if (principal == null)
{
8 years ago
await authentication.ChallengeAsync(appAuthSheme);
8 years ago
if (Response.StatusCode == 200)
return new HttpUnauthorizedResult();
return new HttpStatusCodeResult(Response.StatusCode);
}
string[] scopes = { };
string redirect_uri=null;
8 years ago
IDictionary<string,StringValues> queryStringComponents = null;
8 years ago
if (Request.QueryString.HasValue)
{
8 years ago
queryStringComponents = QueryHelpers.ParseQuery(Request.QueryString.Value);
8 years ago
if (queryStringComponents.ContainsKey("scope"))
scopes = ((string)queryStringComponents["scope"]).Split(' ');
8 years ago
if (queryStringComponents.ContainsKey("redirect_uri"))
redirect_uri = queryStringComponents["redirect_uri"];
8 years ago
}
var username = User.GetUserName();
8 years ago
8 years ago
var model = new AuthorisationView {
Scopes = (Constants.SiteScopes.Where(s=> scopes.Contains(s.Id))).ToArray(),
Message = $"Bienvenue {username}."
8 years ago
} ;
8 years ago
if (Request.Method == "POST")
{
if (!string.IsNullOrEmpty(Request.Form["submit.Grant"]))
{
principal = new ClaimsPrincipal(principal.Identities);
ClaimsIdentity primaryIdentity = (ClaimsIdentity)principal.Identity;
foreach (var scope in scopes)
{
primaryIdentity.AddClaim(new Claim("urn:oauth:scope", scope));
}
await authentication.SignInAsync(OAuthDefaults.AuthenticationType, principal);
}
if (!string.IsNullOrEmpty(Request.Form["submit.Deny"]))
{
await authentication.SignOutAsync(appAuthSheme);
if (redirect_uri!=null)
return Redirect(redirect_uri+"?error=scope-denied");
return Redirect("/");
}
8 years ago
if (!string.IsNullOrEmpty(Request.Form["submit.Login"]))
{
8 years ago
await authentication.SignOutAsync(appAuthSheme);
await authentication.ChallengeAsync(appAuthSheme);
8 years ago
return new HttpUnauthorizedResult();
}
}
if (Request.Headers.Keys.Contains("Accept")) {
var accepted = Request.Headers["Accept"];
if (accepted == "application/json")
{
return Ok(model);
}
}
8 years ago
return View(model);
}
8 years ago
[HttpGet("~/oauth/success")]
public IActionResult NativeAuthSuccess ()
{
return RedirectToAction("Index","Home");
}
}
}