Commit 32947d1f authored by Eric Dieckman's avatar Eric Dieckman
Browse files

Add OIDC user

parent 73c7e377
Loading
Loading
Loading
Loading
+26 −5
Original line number Diff line number Diff line
@@ -39,11 +39,6 @@
            Permission to simply access the app (minimum permission.
            </summary>
        </member>
        <member name="M:Cals.Visor.Api.Controllers.AuthController.GetGroups">
            <summary>
            Returns a listing of all system groups, and all groups that the logged-in user is a member of.
            </summary>
        </member>
        <member name="M:Cals.Visor.Api.Identity.ApplicationBuildingExtensions.UseAppIdentity(Microsoft.AspNetCore.Builder.IApplicationBuilder)">
            <summary>
            Enables use of the Visor user identity.
@@ -265,6 +260,32 @@
            <param name="nestedTypeDelimiter">Character to use as a delimiter in nested type names.</param>
            <returns>The pretty printed type name.</returns>
        </member>
        <member name="T:Cals.Authentication.WiscEduClaimTypes">
            <summary>
            Claim types used in UW-Madison OIDC
            </summary>
        </member>
        <member name="T:Cals.Authentication.WiscEduOidcUser">
            <summary>
            Generic UW-Madison user with claims
            </summary>
        </member>
        <member name="T:Cals.Authentication.WiscEduUser">
            <summary>
            Base application user for UW-Madison applications
            </summary>
        </member>
        <member name="P:Cals.Authentication.WiscEduUser.Groups">
            <summary>
            List of all groups of which this user is a member of
            </summary>
        </member>
        <member name="M:Cals.Authentication.WiscEduUser.IsMemberOf(System.String)">
            <summary>
            Returns whether this identity is a member of the specified group
            </summary>
            <remarks><paramref name="group"/> is case insensitive</remarks>
        </member>
        <member name="T:Cals.Api.Validation.ValidateModelAttribute">
            <summary>
            Validates a model state and returns a BadRequest for invalid models.
+5 −18
Original line number Diff line number Diff line
using Cals.Visor.Identity;
using Cals.Visor.Api.Authorization;
using Microsoft.AspNetCore.Mvc;
using Cals.Authentication;

namespace Cals.Visor.Api.Controllers;

@@ -8,24 +9,10 @@ namespace Cals.Visor.Api.Controllers;
[ApiController]
public class AuthController : ControllerBase
{
    private readonly AppGroups _appGroups;

    public AuthController(AppGroups appGroups)
    {
        _appGroups = appGroups;
    }

    // GET: api/auth/groups

    /// <summary>
    /// Returns a listing of all system groups, and all groups that the logged-in user is a member of.
    /// </summary>
    [ProducesResponseType(StatusCodes.Status200OK)]
    [HttpGet("groups", Name = "Auth_Groups")]
    public IActionResult GetGroups()
    [HttpGet("test")]
    public async Task<IActionResult> Test()
    {
        var user = new VisorUser(HttpContext.User);

        return Ok(new { system = _appGroups, user = user.Groups });
        var user = new WiscEduOidcUser(HttpContext.User);
        return Ok(user);
    }
}
+16 −0
Original line number Diff line number Diff line

namespace Cals.Authentication;

public interface IWiscEduUser
{
    string? Email { get; }
    string? FirstName { get; }
    IReadOnlyList<string> Groups { get; }
    string? LastName { get; }
    string? Name { get; }
    string? NetId { get; }
    string? PrincipalName { get; }
    string? Pvi { get; }

    bool IsMemberOf(string group);
}
+16 −0
Original line number Diff line number Diff line
namespace Cals.Authentication;

/// <summary>
/// Claim types used in UW-Madison OIDC
/// </summary>
public class WiscEduClaimTypes
{
    public const string Group = "edumember_is_member_of";
    public const string FirstName = "given_name";
    public const string LastName = "family_name";
    public const string Email = "email";
    public const string PrincipalName = "eduperson_principal_name";
    public const string Name = "name";
    public const string NetId = "sub";
    public const string Pvi = "wiscedu_pvi";
}
+65 −0
Original line number Diff line number Diff line
using System.Security.Claims;
using System.Text.Json;

namespace Cals.Authentication;

/// <summary>
/// Generic UW-Madison user with claims
/// </summary>
public class WiscEduOidcUser : WiscEduUser, IWiscEduUser
{
    protected WiscEduOidcUser()
    {
    }

    public WiscEduOidcUser(IWiscEduUser user) : base(user)
    {
    }
    public WiscEduOidcUser(ClaimsIdentity? identity)
    {
        if (identity == null)
            return;

        Claim? firstNameClaim = identity.FindFirst(WiscEduClaimTypes.FirstName);
        if (firstNameClaim != null) FirstName = firstNameClaim.Value;

        Claim? lastNameClaim = identity.FindFirst(WiscEduClaimTypes.LastName);
        if (lastNameClaim != null) LastName = lastNameClaim.Value;

        Claim? emailClaim = identity.FindFirst(WiscEduClaimTypes.Email);
        if (emailClaim != null) Email = emailClaim.Value;

        Claim? pviClaim = identity.FindFirst(WiscEduClaimTypes.Pvi);
        if (pviClaim != null) Pvi = pviClaim.Value;

        Claim? principalNameClaim = identity.FindFirst(WiscEduClaimTypes.PrincipalName);
        if (principalNameClaim != null) PrincipalName = principalNameClaim.Value;

        Claim? nameClaim = identity.FindFirst(WiscEduClaimTypes.Name);
        if (nameClaim != null) Name = nameClaim.Value;

        Claim? netIdClaim = identity.FindFirst(WiscEduClaimTypes.NetId);
        if (netIdClaim != null) NetId = netIdClaim.Value;

        //// get all group claims and put them in a list of strings
        Claim? groups = identity.FindFirst(WiscEduClaimTypes.Group);
        string groupClaimValue = string.Empty;
        if (groups != null) groupClaimValue = groups.Value;

        _groups = new List<string>();
        if (groups != null && !string.IsNullOrWhiteSpace(groups.Value))
        {
            try
            {
                // The claim is a JSON array
                List<string>? memberships = JsonSerializer.Deserialize<List<string>>(groups.Value);
                _groups = memberships ?? new List<string>();
            }
            catch { }
        }
    }

    public WiscEduOidcUser(ClaimsPrincipal principal) : this((ClaimsIdentity?)principal.Identity)
    {
    }
}
Loading